Program-Me-Rev
Program-Me-Rev

Reputation: 6624

How to remove an all the elements in an array through iteration

I have an array $scripts_stack = []; that holds arrays:

$array_item = array('script' => $file_parts, 'handle' => $file_name, 'src' => $url);
array_push($scripts_stack, $array_item);

<?php

for ($i = 0; $i < sizeof($scripts_stack); $i++) {
    $child_array = $scripts_stack[$i];
    if (is_array($child_array)) {
        // Do things with $child_array, 
        // then remove the child array from $scripts_stack when done with (BELOW)
        unset($scripts_stack[$i]);
    }
}

echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END

However, my attemts only remove half the elements. No matter what I try, it's only half the items that get removed. sizeof($scripts_stack) is always half the size of what it was at the start.

I'm expecting that it would be empty // AT THE END

Why is it that I only get half the elements in the array removed?

Thank you all in advance.

Upvotes: 0

Views: 81

Answers (5)

mehfatitem
mehfatitem

Reputation: 147

May be you can use this script.It's not tested.

foreach($array as $key => $value ) {
    unset($array[$key]);
    echo $value." element is deleted from your array</br>";
}

I hope , it will help you.

Upvotes: 0

Don&#39;t Panic
Don&#39;t Panic

Reputation: 41810

Just FYI, the way you're doing it with for almost works. You just need to establish the count before the loop definition, rather than recounting in the continuation condition.

$count = sizeof($scripts_stack);
for ($i = 0; $i < $count; $i++) {  // ...

Still, I think it would be better to just use a different type of loop as shown in the other answers. I'd personally go for foreach since it should always iterate every element even if some indexes aren't present. (With the way you're building the array, it looks like the indexes should always be sequential, though.)

Another possibility is to shift elements off of the array rather than explicitly unsetting them.

while ($child_array = array_shift($scripts_stack)) {
    // Do things with $child_array,
}

This will definitely remove every element from the array, though. It looks like $child_array should always be an array, so the is_array($child_array) may not be necessary, but if there's more to it that we're not seeing here, and there are some non-array elements that you need to keep, then this won't work.

Upvotes: 2

AbraCadaver
AbraCadaver

Reputation: 78994

As mentioned in other answers, $i increments but the sizeof() the array shrinks. foreach() is probably the most flexible looping for arrays as it exposes the actual key (instead of hoping it starts at 0 and increments by 1) and the value:

foreach ($scripts_stack as $key => $child_array) {
    if (is_array($child_array)) {
        // Do things with $child_array, 
        // then remove the child array from $scripts_stack when done with (BELOW)
        unset($scripts_stack[$key]);
    }
}

Upvotes: 2

Valera Leontyev
Valera Leontyev

Reputation: 1181

The problem root is in comparing $i with sizeof($scripts_stack). Every step further sizeof($scripts_stack) becomes lower (it calculates at every step) and $i becomes higher.

The workaround may look like this:

<?php

$scripts_stack = [];

$array_item = array('script' => 1, 'handle' => 2, 'src' => 3);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);
array_push($scripts_stack, $array_item);

while (sizeof($scripts_stack) > 0) {
    $child_array = array_shift($scripts_stack);
    if (is_array($child_array)) {
        // Do things with $child_array, 
        // then remove the child array from $scripts_stack when done with (BELOW)
    }
}

echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END

https://3v4l.org/N2p3v

Upvotes: -3

Dekel
Dekel

Reputation: 62576

You advanced $i while the array is getting shrinked, but in the same time you jump over items in your array.

The first loop is where $i == 0, and then when you removed item 0 in your array, the item that was in the second place has moved to the first place, and your $i == (so you will not remove the item in the current first place, and so on.

What you can do is use while instead of for loop:

<?php
$i = 0;
while ($i < sizeof($scripts_stack)) {
    $child_array = $scripts_stack[$i];
    if (is_array($child_array)) {
        // Do things with $child_array, 
        // then remove the child array from $scripts_stack when done with (BELOW)
        unset($scripts_stack[$i]);
    } else {
        $i++;
    }
}

echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END

Upvotes: 1

Related Questions