Psyche
Psyche

Reputation: 8783

Removing an element from an array not working

I have the following code to remove an element from an array:

for ($i = 0; $i < count($contracte); $i++) {  
    if ($contracte[$i]['total_luni_contract'] == $contracte[$i]['luni_contract_cu_cheltuieli']) {
        unset($contracte[$i]);        
    }
}

The array looks like this:

Array
(
    [0] => Array
        (
            [id_contract] => 3
            [numar] => 2955
            [data] => 2011-04-04
            [total_luni_contract] => 2
            [luni_contract_cu_cheltuieli] => 0
        )

    [1] => Array
        (
            [id_contract] => 25
            [numar] => 14
            [data] => 2013-01-07
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 1
        )

    [2] => Array
        (
            [id_contract] => 26
            [numar] => 15
            [data] => 2013-01-07
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 1
        )

    [3] => Array
        (
            [id_contract] => 27
            [numar] => 16
            [data] => 2013-01-07
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [4] => Array
        (
            [id_contract] => 28
            [numar] => 17
            [data] => 2013-01-07
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [5] => Array
        (
            [id_contract] => 29
            [numar] => 23
            [data] => 2013-01-08
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 0
        )

    [6] => Array
        (
            [id_contract] => 30
            [numar] => 24
            [data] => 2013-01-08
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 0
        )

    [7] => Array
        (
            [id_contract] => 31
            [numar] => 33
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 1
        )

    [8] => Array
        (
            [id_contract] => 32
            [numar] => 34
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [9] => Array
        (
            [id_contract] => 33
            [numar] => 35
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [10] => Array
        (
            [id_contract] => 34
            [numar] => 36
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [11] => Array
        (
            [id_contract] => 35
            [numar] => 37
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [12] => Array
        (
            [id_contract] => 36
            [numar] => 38
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [13] => Array
        (
            [id_contract] => 37
            [numar] => 39
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [14] => Array
        (
            [id_contract] => 38
            [numar] => 40
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [15] => Array
        (
            [id_contract] => 39
            [numar] => 41
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [16] => Array
        (
            [id_contract] => 40
            [numar] => 42
            [data] => 2013-01-09
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 0
        )

    [17] => Array
        (
            [id_contract] => 41
            [numar] => 43
            [data] => 2013-01-09
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 0
        )

    [18] => Array
        (
            [id_contract] => 42
            [numar] => 44
            [data] => 2013-01-09
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 0
        )

    [19] => Array
        (
            [id_contract] => 43
            [numar] => 45
            [data] => 2013-01-09
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 0
        )

    [20] => Array
        (
            [id_contract] => 44
            [numar] => 46
            [data] => 2013-01-09
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 6
        )

    [21] => Array
        (
            [id_contract] => 45
            [numar] => 47
            [data] => 2013-01-09
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 6
        )

    [22] => Array
        (
            [id_contract] => 46
            [numar] => 48
            [data] => 2013-01-09
            [total_luni_contract] => 6
            [luni_contract_cu_cheltuieli] => 4
        )

)

After I run the code, the array remains the same. It should unset $contracte[1], $contracte[2], $contracte[7] and $contracte[20].

Any ideeas?

Upvotes: 0

Views: 469

Answers (3)

silkfire
silkfire

Reputation: 26033

Run a foreach on the array instead. It has been proved that it is perfectly safe to remove keys from an array that you're currently iterating on with a foreach loop.

foreach($contracte as $cheie => $contract) {
   if ($contract['total_luni_contract'] == $contract['luni_contract_cu_cheltuieli']) {
      unset($contracte[$cheie]);
   }
}

Upvotes: 1

Prasanth Bendra
Prasanth Bendra

Reputation: 32810

Issue : When loop reaches second element (1) it unsets it, so element at 2 comes to that position. so in next loop it checks for $i=1 which will be next element. so (2) got skipped.

Solution :

Use foreach

foreach($contracte as $key=> $val) {
   if ($val['total_luni_contract'] == $val['luni_contract_cu_cheltuieli']) {
      unset($contracte[$key]);
   }
}

OR

Make the key as strings - make it associative array and then your solution.

If your array is something like this : It will work

Array
(
    [one] => Array
        (
            [id_contract] => 3
            [numar] => 2955
            [data] => 2011-04-04
            [total_luni_contract] => 2
            [luni_contract_cu_cheltuieli] => 0
        )

    [two] => Array
        (
            [id_contract] => 25
            [numar] => 14
            [data] => 2013-01-07
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 1
        )

    [three] => Array
        (
            [id_contract] => 26
            [numar] => 15
            [data] => 2013-01-07
            [total_luni_contract] => 1
            [luni_contract_cu_cheltuieli] => 1
        )

    [four] => Array
        (
            [id_contract] 

Upvotes: 1

Spencer Alger
Spencer Alger

Reputation: 958

Try using array_splice instead

array_splice($contracte, $i, 1);

Also, you'll want to decrement $i when you remove something from the array so it will check the item at position $i a second time.

Upvotes: 0

Related Questions