Я работаю с многомерным массивом, я хочу иметь возможность удалить массив (и все дочерние элементы), которые соответствуют идентификатору.
Функция, которую я пробовал:
function removeKey($key, $array, $childKey = 'children'){ if(isset($array[$key])){ unset($array[$key]); return $array; } foreach($array as &$item) if(isset($item[$childKey])) $item = removeKey($key, $item[$childKey], $childKey); return $array; }
Мой массив примеров:
Array ( [5] => Array ( [id] => 5 [parent_id] => [menu_title] => Drinks [page_title] => Drinks [status] => 1 [products] => 0 ) [1] => Array ( [id] => 1 [parent_id] => [menu_title] => Electronics [page_title] => Electronics [status] => 1 [products] => 0 [children] => Array ( [2] => Array ( [id] => 2 [parent_id] => 1 [menu_title] => Computers [page_title] => Computers [status] => 1 [products] => 0 [children] => Array ( [4] => Array ( [id] => 4 [parent_id] => 2 [menu_title] => Apple [page_title] => Apple - Imacs and Macbooks [status] => 1 [products] => 0 ) ) ) [3] => Array ( [id] => 3 [parent_id] => 1 [menu_title] => Mobile Phones [page_title] => Mobile Phones [status] => 1 [products] => 0 ) ) ) )
и результат, который я ищу (вызов функции с (2, $array, 'children')
):
Array ( [5] => Array ( [id] => 5 [parent_id] => [menu_title] => Drinks [page_title] => Drinks [status] => 1 [products] => 0 ) [1] => Array ( [id] => 1 [parent_id] => [menu_title] => Electronics [page_title] => Electronics [status] => 1 [products] => 0 [children] => Array ( [3] => Array ( [id] => 3 [parent_id] => 1 [menu_title] => Mobile Phones [page_title] => Mobile Phones [status] => 1 [products] => 0 ) ) ) )
но результат, который я получаю,
Array ( [5] => Array ( [id] => 5 [parent_id] => [menu_title] => Drinks [page_title] => Drinks [status] => 1 [products] => 0 ) [1] => Array ( [3] => Array ( [id] => 3 [parent_id] => 1 [menu_title] => Mobile Phones [page_title] => Mobile Phones [status] => 1 [products] => 0 ) ) )
Я понятия не имею, что здесь происходит!
Вы можете облегчить ситуацию, используя только ссылки.
function removeKey($key, &$array, $childKey = 'children'){ if(isset($array[$key])){ unset($array[$key]); return; } foreach($array as &$item) if(isset($item[$childKey])) removeKey($key, $item[$childKey], $childKey); }
сfunction removeKey($key, &$array, $childKey = 'children'){ if(isset($array[$key])){ unset($array[$key]); return; } foreach($array as &$item) if(isset($item[$childKey])) removeKey($key, $item[$childKey], $childKey); }
Пример:
$arr = array(...); removeKey('key', $arr, $chilKey); // Just continue using $arr
Что относительно многомерного массива? Я был исследован на пару часов для этого решения, нигде не нашел оптимального решения. поэтому, я написал это сам
function allow_keys($arr, $keys) { $saved = []; foreach ($keys as $key => $value) { if (is_int($key) || is_int($value)) { $keysKey = $value; } else { $keysKey = $key; } if (isset($arr[$keysKey])) { $saved[$keysKey] = $arr[$keysKey]; if (is_array($value)) { $saved[$keysKey] = allow_keys($saved[$keysKey], $keys[$keysKey]); } } } return $saved; }
использовать: пример
$array = [ 'key1' => 'kw', 'loaa'=> ['looo'], 'k' => [ 'prope' => [ 'prop' => ['proo', 'prot', 'loolooo', 'de'], 'prop2' => ['hun' => 'lu'], ], 'prop1' => [ ], ], ];
call: example
allow_keys($array, ['key1', 'k' => ['prope' => ['prop' => [0, 1], 'prop2']]])
вывод:
Array ( [key1] => kw [k] => Array ( [prope] => Array ( [prop] => Array ( [0] => proo [1] => prot ) [prop2] => Array ( [hun] => lu ) ) ) )
поэтому вы получаете только нужные ключи из многомерного массива. он не ограничивается только «многомерным», вы можете использовать его, передавая массив вроде
['key1', 'loaa']
вы получаете:
Array ( [key1] => kw [loaa] => Array ( [0] => looo ) )
надеюсь, кто-то помогает этому, поскольку я много искал, и ничего не нашел. ура!