在PHP多维数组中删除Parent

时间:2010-03-07 10:04:55

标签: php arrays multidimensional-array

在多维数组中删除匹配键的父级的最佳方法是什么?例如,假设我们有以下数组,我想找到“[text] = a”,然后删除它的父数组[0] ......

(array) Array
(

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

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

5 个答案:

答案 0 :(得分:6)

这是显而易见的:

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

答案 1 :(得分:2)

内部数组不维护对其“父”数组的任何引用,因此您必须编写一个函数来手动跟踪它。这样的事情可能有用:

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;
        }
    }
}

请注意,此设计适用于任何嵌套级别,而不仅仅是两个维度,因此如果您只需要在示例中使用它,则可能会有点过分。

答案 2 :(得分:2)

使用array_filter

function filter_callback($v) {
  return !isset($v['text']) || $v['text'] !== 'a';
}
$array = array_filter($array, 'filter_callback');

这只会在text != a的数组中留下'父元素',因此删除文本等于

的那些元素

答案 3 :(得分:0)

我的实施:

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');

测试它:

<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>

此函数以递归方式执行。

答案 4 :(得分:0)

一个简单而安全的解决方案(我不会从我正在循环的数组中删除/取消设置元素)可能是:

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