How can I remove all data in an array - PHP - php

I'm trying to delete all the data in this array. I'm beginer
$data = array(
['id' => 1, 'name' => 'Alex'],
['id' => 2, 'name' => 'Max'],
['id' => 3, 'name' => 'George']
);
I'm using this code to do it, but it doesn't work :(
foreach ($data as $item) {
unset($item);
}

When you want to clear the complete array, why not using unset($data)?
Your code does not work they way as you expect it, because in your loop you are defining a new variable $item. You are then unsetting this variable $item which has no effect on original the values of your $data array.
If you want to use a loop you need to define it like that:
foreach ($data as $index => $item) {
unset($data[$index]);
}
This clears all values from $data but not unsetting the $data array itself.
A more efficient way compared to the loop would be to just assign a empty array to $data like:
$data = [];

Related

Create Array Inside Foreach Loop

How to put these codes in a foreach loop?
$item1_details = array(
'id' => 'a1',
'price' => 18000,
'quantity' => 3,
'name' => "Apple"
);
$item2_details = array(
'id' => 'a2',
'price' => 20000,
'quantity' => 2,
'name' => "Orange"
);
Then the array above will be saved in a variable. It's an array. And, yes, I have no idea how to do a loop inside array. So please help me for this too.
$item_details = array ($item1_details, $item2_details);
Thus, I have to questions. First, how to create an array inside a foreach loop. Second, How to loop inside an array.
You don't put a loop inside an array, you push onto the array in a loop.
$item_details = array();
for ($i = 0; $i < 10; $i++) {
$item_details[] = $item1_details;
$item_details[] = $item2_details;
}
This will make an array with 10 alternating copies of $item1_details and $item2_details.
You mentioned a foreach loop, but that's for looping over an array that already exists. You didn't show any array to loop over, so I'm not sure how it applies in this case.
You can use array_values with array_merge
$f = array_merge(array_values($item1_details), array_values($item2_details));
Working example :- https://3v4l.org/fDM3N

I want to store the 0 indexes of name,email,contact in new array and vice versa all data

My result is that the appended data look like this on form request in laravel
I want this type of array in my result the first data of append block store in single index and then vice versa all data
name=>basit
email=>kashif#gmail.com
contact=>5454
])
sub_contact => array([
name=>basit
email=>hamza12433#gmail.com
contact=>53543
])
You don't need to change your request array structure. Just loop through an element and insert values into database.
foreach($request->name as $key => $value){
Model::create([
'name' => $request->name[$key],
'email' => $request->email[$key],
'contact' => $request->contact[$key],
]);
}
You can loop one of the subarrays and use the key in a array_column to get all the values.
$keys = array_keys($arr);
foreach($arr[$keys[0]] as $index => $value){
$result[] = array_combine($keys, array_column($arr, $index));
}
var_dump($result);
https://3v4l.org/kUPi4
Or nest the foreach to get the values that way.
I believe this method is faster than array_column one.
foreach($arr as $key => $value){
foreach($value as $index => $item){
$result[$index][$key] = $item;
}
}
var_dump($result);
https://3v4l.org/DCP5W

PHP array_merge overwrites itself

I'm struggling with array_merge to make an array of items. The code which I have:
$items = [];
foreach ($products as $product) {
Log::info($product->orderproduct->idorder_product);
$items = array_merge($items, [
'id' => $product->orderproduct->idorder_product
]);
}
Log::info(print_r($items, true));
The output is:
6
7
['id' => 7]
How can I create an array with both id's?
Not sure what result you expect, so there are 2 options:
foreach ($products as $product) {
Log::info($product->orderproduct->idorder_product);
// First
$items[] = $product->orderproduct->idorder_product;
// Second
$items[] = ['id' => $product->orderproduct->idorder_product];
}
Array merge is just another array which add into the bottom of the array.
I think you are misleading us on the result you want to get.
$items = array(); / $items = [];
you can push the data into array easily by this code
$items[] = array(
'id' => $product->orderproduct->idorder_product,
)

Exploding and replacing one array field

So, I have an array that, for unrelated reasons, has one imploded field in itself. Now, I'm interested in exploding the string in that field, and replacing that field with the results of the blast. I kinda-sorta have a working solution here, but it looks clunky, and I'm interested in something more efficient. Or at least aesthetically pleasing.
Example array:
$items = array(
'name' => 'shirt',
'kind' => 'blue|long|L',
'price' => 10,
'amount' => 5);
And the goal is to replace the 'kind' field with 'color', 'lenght', 'size' fields.
So far I've got:
$attribs = array('color', 'lenght', 'size'); // future indices
$temp = explode("|", $items['kind']); // exploding the field
foreach ($items as $key => $value) { // iterating through old array
if ($key == 'kind') {
foreach ($temp as $k => $v) { // iterating through exploded array
$new_items[$attribs[$k]] = $v; // assigning new array, exploded values
}
}
else $new_items[$key] = $value; // assigning new array, untouched values
}
This should (I'm writing by heart, don't have the access to my own code, and I can't verify the one I just wrote... so if there's any errors, I apologize) result in a new array, that looks something like this:
$new_items = array(
'name' => 'shirt',
'color' => 'blue',
'lenght' => 'long',
'size' => 'L',
'price' => 10,
'amount' => 5);
I could, for instance, just append those values to the $items array and unset($items['kind']), but that would throw the order out of whack, and I kinda need it for subsequent foreach loops.
So, is there an easier way to do it?
EDIT:
(Reply to Visage and Ignacio - since reply messes the code up)
If I call one in a foreach loop, it calls them in a specific order. If I just append, I mess with the order I need for a table display. I'd have to complicate the display code, which relies on a set way I get the initial data.
Currently, I display data with (or equivalent):
foreach($new_items as $v) echo "<td>$v</td>\n";
If I just append, I'd have to do something like:
echo "<td>$new_items['name']</td>\n";
foreach ($attribs as $v) echo "<td>$new_items[$v]</td>\n";
echo "<td>$new_items['price']</td>\n";
echo "<td>$new_items['amount']</td>\n";
Associative arrays generally should not depend on order. I would consider modifying the later code to just index the array directly and forgo the loop.
Try this:
$items = array( 'name' => 'shirt', 'kind' => 'blue|long|L', 'price' => 10, 'amount' => 5);
list($items['color'], $items['lenght'], $items['size'])=explode("|",$items['kind']);
unset $items['kind'];
I've not tested it but it should work.
Associative arrays do not have an order, so you can just unset the keys you no longer want and then simply assign the new values to new keys.
one way
$items = array(
'name' => 'shirt',
'kind' => 'blue|long|L',
'price' => 10,
'amount' => 5);
$attribs = array('color', 'lenght', 'size');
$temp = explode("|", $items['kind']);
$s = array_combine($attribs,$temp);
unset($items["kind"]);
print_r( array_merge( $items, $s) );
This should retain the ordering because it splits the keys and values into two numerically ordered arrays and combines them at the end. It isn't more efficient, but the code is easier to read.
$kind_keys = array('color', 'length', 'size');
$kind_values = explode("|", $items['kind']);
$keys = array_keys($items);
$values = array_values($items);
$index = array_search('kind', $keys);
// Put the new keys/values in:
array_splice($keys, $index, 1, $kind_keys);
array_splice($values, $index, 1, $kind_values);
// combine the result into a new array:
$result = array_combine($keys, $values));

Setting value in Nested Php Array

Hi I'm trying to loop through a array and set a keys value. Very basic question.
The Code I tried is below.
http://pastebin.com/d3ddab156
<?php
$testArray = array("bob1" => array( 'name' => "bob1", 'setTest' => '2'));
foreach($testArray as $item)
{
$item['setTest'] = 'bob';
}
print_r($testArray);
I imagine I'm missing something stupid here and it is going to be a D'oh! moment for me. What is wrong with it?
Thanks.
You do:
$testArray = array("bob1" => array( 'name' => "bob1", 'setTest' => '2'));
foreach($testArray as $item)
{
$item['setTest'] = 'bob';
}
print_r($testArray);
$item is a copy. You change the copy, not the real array. Try this:
$testArray = array("bob1" => array( 'name' => "bob1", 'setTest' => '2'));
foreach($testArray as $key => $item)
{
$testArray[$key]['setTest'] = 'bob';
}
print_r($testArray);
Or, if you have a lot of data in the array and want to avoid creating a complete copy of each element over every iteration, simply iterate over each element as a reference. Then only a reference to that item is created i memory and you can directly manipulate the array element by using $item:
$testArray = array("bob1" => array( 'name' => "bob1", 'setTest' => '2'));
foreach($testArray as &$item)
{
$item['setTest'] = 'bob';
}
print_r($testArray);
NOTE: be sure to unset $item after the loop so you don't inadvertantly modify the array later by using that variable name.

Categories