Blank array - only removing half of them

Asked

Viewed 53 times

1

I have the following array:

Array
(
    [0] => Array
        (
            [Produto] => ENH1264-1
            [Quantidade] => 1
        )

    [1] => Array
        (
            [Produto] => ENH1264-3
            [Quantidade] => 2
        )

    [2] => Array
        (
            [Produto] => ENH1264-4
            [Quantidade] => 3
        )

    [3] => Array
        (
            [Produto] => ENH1264-6
            [Quantidade] => 0
        )

    [4] => Array
        (
            [Produto] => ENH1264-5
            [Quantidade] => 0
        )

    [5] => Array
        (
            [Produto] => ENH1264-2
            [Quantidade] => 0
        )

    [6] => Array
        (
            [Produto] => ENH1266-3
            [Quantidade] => 0
        )

    [7] => Array
        (
            [Produto] => ENH1266-5
            [Quantidade] => 0
        )

    [8] => Array
        (
            [Produto] => ENH1266-4
            [Quantidade] => 0
        )

    [9] => Array
        (
            [Produto] => ENH1266-6
            [Quantidade] => 0
        )

    [10] => Array
        (
            [Produto] => ENH1266-1
            [Quantidade] => 0
        )

    [11] => Array
        (
            [Produto] => ENH1266-2
            [Quantidade] => 0
        )

    [12] => Array
        (
            [Produto] => ENH1267-6
            [Quantidade] => 0
        )

    [13] => Array
        (
            [Produto] => ENH1267-5
            [Quantidade] => 0
        )

    [14] => Array
        (
            [Produto] => ENH1267-4
            [Quantidade] => 0
        )

    [15] => Array
        (
            [Produto] => ENH1267-3
            [Quantidade] => 0
        )

    [16] => Array
        (
            [Produto] => ENH1267-2
            [Quantidade] => 0
        )

    [17] => Array
        (
            [Produto] => ENH1267-1
            [Quantidade] => 0
        )

    [18] => Array
        (
            [Produto] => ENH1268-6
            [Quantidade] => 0
        )

    [19] => Array
        (
            [Produto] => ENH1268-5
            [Quantidade] => 0
        )

    [20] => Array
        (
            [Produto] => ENH1268-4
            [Quantidade] => 0
        )

    [21] => Array
        (
            [Produto] => ENH1268-3
            [Quantidade] => 0
        )

    [22] => Array
        (
            [Produto] => ENH1268-2
            [Quantidade] => 0
        )

    [23] => Array
        (
            [Produto] => ENH1268-1
            [Quantidade] => 0
        )

    [24] => Array
        (
            [Produto] => ENH1364-6
            [Quantidade] => 0
        )

    [25] => Array
        (
            [Produto] => ENH1364-4
            [Quantidade] => 0
        )

    [26] => Array
        (
            [Produto] => ENH1364-3
            [Quantidade] => 0
        )

    [27] => Array
        (
            [Produto] => ENH1364-2
            [Quantidade] => 0
        )

    [28] => Array
        (
            [Produto] => ENH1364-1
            [Quantidade] => 0
        )

    [29] => Array
        (
            [Produto] => ENH1354-2
            [Quantidade] => 0
        )

    [30] => Array
        (
            [Produto] => ENH1354-3
            [Quantidade] => 0
        )

    [31] => Array
        (
            [Produto] => ENH1354-4
            [Quantidade] => 0
        )

    [32] => Array
        (
            [Produto] => ENH1354-6
            [Quantidade] => 0
        )

    [33] => Array
        (
            [Produto] => ENH1354-1
            [Quantidade] => 0
        )

    [34] => Array
        (
            [Produto] => ENH1355-2
            [Quantidade] => 0
        )

    [35] => Array
        (
            [Produto] => ENH1355-3
            [Quantidade] => 0
        )

    [36] => Array
        (
            [Produto] => ENH1355-4
            [Quantidade] => 0
        )

    [37] => Array
        (
            [Produto] => ENH1355-6
            [Quantidade] => 0
        )

    [38] => Array
        (
            [Produto] => ENH1355-1
            [Quantidade] => 0
        )

    [39] => Array
        (
            [Produto] => ENH1356-6
            [Quantidade] => 0
        )

    [40] => Array
        (
            [Produto] => ENH1356-4
            [Quantidade] => 0
        )

    [41] => Array
        (
            [Produto] => ENH1356-3
            [Quantidade] => 1
        )

    [42] => Array
        (
            [Produto] => ENH1356-2
            [Quantidade] => 2
        )

    [43] => Array
        (
            [Produto] => ENH1356-1
            [Quantidade] => 3
        )

)

I am doing a check so that when the index has Quantity = 0, remove the array.

for($i = 0; $i < count($arrayMerging); $i++){

    if($arrayMerging[$i]['Quantidade'] == 0){

        unset($arrayMerging[$i]);

    }

}

However, it is only removing from [3] until [23] for some reason that I am not finding. There are still arrays from [24] to [40] to remove, and do not remove.

I’m doing something wrong?

Array
(
    [0] => Array
        (
            [Produto] => ENH1264-1
            [Quantidade] => 1
        )

    [1] => Array
        (
            [Produto] => ENH1264-3
            [Quantidade] => 2
        )

    [2] => Array
        (
            [Produto] => ENH1264-4
            [Quantidade] => 3
        )

    [24] => Array
        (
            [Produto] => ENH1364-6
            [Quantidade] => 0
        )

    [25] => Array
        (
            [Produto] => ENH1364-4
            [Quantidade] => 0
        )

    [26] => Array
        (
            [Produto] => ENH1364-3
            [Quantidade] => 0
        )

    [27] => Array
        (
            [Produto] => ENH1364-2
            [Quantidade] => 0
        )

    [28] => Array
        (
            [Produto] => ENH1364-1
            [Quantidade] => 0
        )

    [29] => Array
        (
            [Produto] => ENH1354-2
            [Quantidade] => 0
        )

    [30] => Array
        (
            [Produto] => ENH1354-3
            [Quantidade] => 0
        )

    [31] => Array
        (
            [Produto] => ENH1354-4
            [Quantidade] => 0
        )

    [32] => Array
        (
            [Produto] => ENH1354-6
            [Quantidade] => 0
        )

    [33] => Array
        (
            [Produto] => ENH1354-1
            [Quantidade] => 0
        )

    [34] => Array
        (
            [Produto] => ENH1355-2
            [Quantidade] => 0
        )

    [35] => Array
        (
            [Produto] => ENH1355-3
            [Quantidade] => 0
        )

    [36] => Array
        (
            [Produto] => ENH1355-4
            [Quantidade] => 0
        )

    [37] => Array
        (
            [Produto] => ENH1355-6
            [Quantidade] => 0
        )

    [38] => Array
        (
            [Produto] => ENH1355-1
            [Quantidade] => 0
        )

    [39] => Array
        (
            [Produto] => ENH1356-6
            [Quantidade] => 0
        )

    [40] => Array
        (
            [Produto] => ENH1356-4
            [Quantidade] => 0
        )

    [41] => Array
        (
            [Produto] => ENH1356-3
            [Quantidade] => 1
        )

    [42] => Array
        (
            [Produto] => ENH1356-2
            [Quantidade] => 2
        )

    [43] => Array
        (
            [Produto] => ENH1356-1
            [Quantidade] => 3
        )

)
  • You can provide the array statement to be easy to reproduce the problem ?

1 answer

1


This response is based on version 5.4 of PHP

The problem is the language builder unset().

You don’t know exactly why, because PHP does not limit the use of this constructor in its manual, but this problem happens when it is called several times. Take this test:

for($i = 0; $i < count($arrayMerging); $i++){

    echo $i."</br>";
    if($arrayMerging[$i]['Quantidade'] == 0){

       unset($arrayMerging[$i]);

    }

}

Notice that there is a break in the loop just at Indice 23.

What you can do is create a new array (this php accepts in a good), and use the unset() to delete the old:

$newArray = array();
    for($i = 0; $i < count($arrayMerging); $i++){
        echo $i."</br>";
        if($arrayMerging[$i]['Quantidade'] !== 0){

            $newArray[] = $arrayMerging[$i];

        }

    }
    unset($arrayMerging);
    print_r($newArray);
  • 1

    Gee, that’s crazy. So this "bug" in unset() is recurring? I thought I was the problem... hehe. I thought about doing it this way too, generating a new array, but I wanted to see how far I had gone wrong using unset. Thanks, @Andrei Coelho

  • 1

    @Maykelesser yes, it’s very strange. It happened to me a few months ago. I even tested it on other servers and it happens the same way. I don’t know why, because as I said, in the php manual it doesn’t say ANYTHING about the execution limit of this language builder. In addition, with other builders, such as the echo, that does not happen. Another strange thing, is that it does not generate any kind of error it just leaves the loop. If anyone ever knows why, post it here. Hug!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.