Удалите родителя в многомерном массиве PHP

Что лучший способ состоит в том, чтобы удалить родителя подобранного ключа в Многомерном массиве? Например, давайте предположим, что у нас есть следующий массив, и я хочу найти" [текст] =" и затем удалить его родительский массив [0]...

(array) Array
(

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

[1] => Array
    (
        [text] => k
        [height] => 30
    )
)
7
задан hakre 4 October 2012 в 08:52
поделиться

5 ответов

Вот очевидное:

foreach ($array as $key => $item) {
    if ($item['text'] === 'a') {
        unset($array[$key]);
    }
}
6
ответ дан 6 December 2019 в 23:04
поделиться

используя array_filter:

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

это оставит в массиве только "родительские элементы", где text != a, таким образом удаляя те, где text равен a

3
ответ дан 6 December 2019 в 23:04
поделиться

Внутренние массивы не сохраняют никаких ссылок на свои "родительские" массивы, поэтому вам придется написать функцию для ручного отслеживания этого. Может сработать что-то вроде этого:

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
ответ дан 6 December 2019 в 23:04
поделиться

Простым и безопасным решением (я бы не стал удалять / отменять элементы из массива, который я просматриваю в цикле) может быть:

$new_array = array();
foreach($array as $item)
{
    if($item['text'] != "a")
    {
        $new_array[] = $item;
    }
}
0
ответ дан 6 December 2019 в 23:04
поделиться

Моя реализация:

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>

Эта функция делает это рекурсивно.

0
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: