PHP çok boyutlu Array Veli Kaldır

5 Cevap php

Bir boyutlu Array eşleşen bir anahtarın üst çıkarmak için en iyi yolu nedir? Örneğin, aşağıdaki dizi var varsayalım ve ben bulmak istiyorum "[text] = a" ve daha sonra kendi ana diziyi silmek [0] ...

(array) Array
(

[0] => Array
    (
        [text] => a
        [height] => 30
    )

[1] => Array
    (
        [text] => k
        [height] => 30
    )
)

5 Cevap

İşte açıktır:

foreach ($array as $key => $item) {
    if ($item['text'] === 'a') {
        unset($array[$key]);
    }
}

İç diziler onların "ana" dizileri için herhangi bir başvuru kurmayız, bu nedenle elle izlemek için bir işlevi yazmak gerekiyor. Böyle bir şey işe yarayabilir:

function searchAndDestroy(&$arr, $needle) {
    foreach ($arr as &$item) {
        if (is_array($item)) {
            if (searchAndDestroy($item, $needle)) {
                return true;
            }
        } else if ($item === $needle) {
            $item = null;
            return true;
        }
    }
}

Bu iç içe, sadece iki boyutta herhangi bir düzeyde çalışmak üzere tasarlanmıştır, böylece sadece sizin örnekteki gibi durumlar için ihtiyacınız eğer biraz overkill olabileceğini unutmayın.

Benim uygulama:

function searchAndDestroy(&$a, $key, $val){
    foreach($a as $k => &$v){
        if(is_array($v)){
            $r = searchAndDestroy(&$v, $key, $val);
            if($r){
                unset($a[$k]);
            }
        }elseif($key == $k && $val == $v){
            return true;
        }
    }
    return false;
}

searchAndDestroy($arr, 'text', 'a');

Bunu test etmek için:

<pre><?php

function searchAndDestroy(&$a, $key, $val){
    foreach($a as $k => &$v){
        if(is_array($v)){
            $r = searchAndDestroy(&$v, $key, $val);
            if($r){
                unset($a[$k]);
            }
        }elseif($key == $k && $val == $v){
            return true;
        }
    }
    return false;
}

$arr = array(array('text'=>'a','height'=>'30'),array('text'=>'k','height'=>array('text'=>'a','height'=>'20')));

var_dump($arr);

searchAndDestroy($arr, 'text', 'a');

var_dump($arr);

?></pre>

Bu işlev özyinelemeli yapar.

Basit ve güvenli bir çözüm (ben döngü ediyorum diziden / unset öğeleri kaldırmak istemiyorum) olabilir:

$new_array = array();
foreach($array as $item)
{
    if($item['text'] != "a")
    {
        $new_array[] = $item;
    }
}