У меня есть 2 массива, мне нужно найти, соответствует ли одно из значений в массиве одно из значений в массиве два, многомерном массиве. Мне также нужно проверить, что значение из массива 1 находится в определенном ключе в массиве два, «основной» ключ, так как «полномочный» ключ может также удерживать это значение.
вот массив один:
Array ( [0] => 17 [1] => 6 [2] => 3 [3] => 2 )
и массив два [фактически немного усеченный для удобочитаемости]:
Array ( [modAccessResourceGroup] => Array ( [3] => Array ( [0] => Array ( [principal] => 0 [authority] => 9999 [policy] => Array ( [load] => 1 ) ) [1] => Array ( [principal] => 2 [authority] => 10 [policy] => Array ( [add_children] => 1 [create] => 1 [copy] => 1 [delete] => 1 [list] => 1 [load] => 1 [move] => 1 [publish] => 1 [remove] => 1 [save] => 1 [steal_lock] => 1 [undelete] => 1 [unpublish] => 1 [view] => 1 ) ) .... truncated .... [13] => Array ( [principal] => 16 [authority] => 9999 [policy] => Array ( [load] => 1 ) ) ) [8] => Array ( [0] => Array ( [principal] => 0 [authority] => 9999 [policy] => Array ( [load] => 1 ) ) [1] => Array ( [principal] => 1 [authority] => 9999 [policy] => Array ( [add_children] => 1 [create] => 1 [copy] => 1 [delete] => 1 [list] => 1 [load] => 1 [move] => 1 [publish] => 1 [remove] => 1 [save] => 1 [steal_lock] => 1 [undelete] => 1 [unpublish] => 1 [view] => 1 ) ) [2] => Array ( [principal] => 22 [authority] => 9999 [policy] => Array ( [add_children] => 1 [create] => 1 [copy] => 1 [delete] => 1 [list] => 1 [load] => 1 [move] => 1 [publish] => 1 [remove] => 1 [save] => 1 [steal_lock] => 1 [undelete] => 1 [unpublish] => 1 [view] => 1 ) ) ) ) )
Я использовал серию foreach () {foreach () {foreach () {}}}, но это казалось очень грязным и неэффективным. Имею некоторые проблемы с моей головой вокруг этого. Есть идеи?
Рекурсивная функция должна делать трюк:
$values = array(17, 6, 3, 2, 5); function find($array, &$values) { foreach ($array as $key => $element) { if (is_array($element)) { find($element, $values); } elseif ($key == 'principal') { foreach ($values as $value) { if ($element == $value) { echo 'Found' . PHP_EOL; // Do stuff } } } } } find($array, $values);
На ум приходят несколько вещей. Во-первых, в таких ситуациях я обычно создаю отдельный массив с только главными значениями, чтобы я мог перебирать первый массив и просто использовать простую проверку in_array()
. Во-вторых, если вы не хотите этого делать, вы можете сделать что-то, используя функцию array_walk_recursive () или некоторые из рекурсивных примеров в array_search (), чтобы пройти через ваш второй массив.