在多维数组中删除匹配键的父级的最佳方法是什么?例如,假设我们有以下数组,我想找到“[text] = a”,然后删除它的父数组[0] ......
(array) Array
(
[0] => Array
(
[text] => a
[height] => 30
)
[1] => Array
(
[text] => k
[height] => 30
)
)
答案 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;
}
}