У меня есть массив, который может меняться по своему размеру, иногда может быть небольшим, иногда может идти глубже. Я пытаюсь найти конкретный элемент в массиве, и если он будет найден, я бы хотел получить конкретный родитель. Так, например, если у меня есть массив как:
Опять же, измерение может измениться, однако, я ищу ключ самого внешнего родителя, у которого есть братья и сестры. ( в данном случае )
Array ( [0] => Array ( [0] => Array ( [0] => Array ( <<----------------------------------------+ [0] => FOO0 | [1] => BAR0 //Search BAR0 returns parent key 0 + [2] => Array( | [0] => HELLO0 | [1] => BYE0 //Search BYE0 returns parent key 0 + ) | [3] => FOO0 | [4] => Array ( | [0] => HELLO0 //Search HELLO0 returns parent key 0 -- ) ) [1] => Array ( <<----------------------------------------+ [0] => FOO1 | [1] => BAR1 | [2] => Array ( | [0] => HELLO1 | [1] => BYE1 | ) | [3] => BASE1 | [4] => Array ( | [0] => BAZ1 | [1] => Array ( | [0] => DOO1 //Search DOO1 returns parent key 1 + [1] => BOB2 //Search BOB2 returns parent key 1 + ) ) ) [2] => FOO2 // Search FOO2 returns key 2 (itself) ) ) )
Образец для FOO2
[2] => FOO2 // searched value
Я бы очень признателен за помощь! Благодаря!
Я не совсем уверен, что это то, что вы ищете, но вы можете попробовать:
function find($needle, array $haystack) { foreach ($haystack as $i => $x) { if (is_array($x)) { $b = find($needle, $x); if ($b) return count($haystack) > 1 ? array($i, $x) : $b; } else if ($x == $needle) { return array($i, $x); } } return false; } list($key, $val) = find('FOO1', $data);
Это не возвращает точный элемент, а копию его. Если вы хотите исходный элемент, его нужно будет обновить, чтобы использовать ссылки.
Вы можете изменить array($i, $x)
на array($i => $x)
в обоих местах, если вы не хотите использовать конструкцию list
при запросе функции. Но я думаю, что с ней легче работать, поскольку она написана.
function recursive_array_search($k,$h) { foreach($h as $key=>$v) if($k===$v OR (is_array($v) && recursive_array_search($k,$v) !== false)) return $key; return false; }
Применение:
echo recursive_array_search($searchThis, $InThisArray);
Теперь вам просто нужно изменить это, чтобы вернуть все, что захотите.
Источник: php.net