在PHP多维数组中删除父级

8

如何最好地删除多维数组中匹配键的父级?例如,假设我们有以下数组,并且我想查找“[text] = a”,然后删除其父数组[0]...

(array) Array
(

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

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

所以,您想删除parent数组的其余部分,并仅保留第一个节点? - Adam Kiss
想象一下数组像这样,[0],[1],[2],[3]... 我会移除或者移动 [0]。 - Andres
5个回答

7

以下是显而易见的内容:

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

这在二维数组中有效,但不适用于一般的多维数组。 - nickf
这是我的第一个猜想,但就像你说的那样,它不是递归的。也许再推进一点会有所帮助... - Andres
@Andres:那么在哪种需要递归的多维数组中,它是什么样子的呢? - Gumbo
成功了!有时候捕捉数组的表象意义是有难度的。我一直使用 $key => $val,而没有考虑 $key => $item...@Gumbo 如果(在我的例子中)[text] = array([title] = "Hello", [body] = "this is a test")而我想找到并删除 [title] = hello 的父级,也就是 [text]。 - Andres
@Andres:尝试使用 if ($item['text']['title'] === '…') unset($array[$key]['text']); - Gumbo

4

使用array_filter函数:

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

这将仅在数组中留下“父元素”,其中 text!= a ,因此删除文本等于a的元素。


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

请注意,此设计可在任何嵌套级别上运行,而不仅仅是二维的,因此如果您只需要在类似于您的示例的情况下使用它,则可能有些过度设计。

请注意,数组键可能不是数字。 - mauris

1
一个简单而安全的解决方案(我不会从正在循环遍历的数组中删除/取消设置元素)可能是:
$new_array = array();
foreach($array as $item)
{
    if($item['text'] != "a")
    {
        $new_array[] = $item;
    }
}

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>

这个函数是递归执行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接