2013-04-09 6 views
0

У меня есть 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 
           ) 

         ) 

       ) 

     ) 

) 

Я использовал серию Еогеаспа() {Еогеасп() {Еогеасп () {}}}, но это казалось очень грязным и неэффективным. Имею некоторые проблемы с моей головой вокруг этого. Есть идеи?

+0

Итак, что бы набрать один образец в вашем примере? –

+0

Мне нужно найти, соответствует ли какое-либо из значений в массиве любому из значений «принципала» в массиве два. –

ответ

1

Рекурсивная функция должна сделать трюк:

$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); 
+0

Я обязательно попробую, но мне нужно, чтобы он был как можно более легким, возможно, код мог быть выполнен до 2000 раз за запрос. то есть искать рекурсивно через массив 2000+ для каждого запроса. –

+0

Рекурсия обычно довольно быстрая, но если вы можете, вы можете попробовать сохранить основные значения в отдельном одномерном массиве, чтобы вы могли использовать функцию in_array, чтобы проверить, существует ли там значение. Если это все, что вам нужно, это будет очень быстро. – Revent

+0

Как предложил Ревент [array_walk_recursive] (http://php.net/manual/en/function.array-walk-recursive.php), это тоже хорошее решение. –

1

Несколько вещей приходят на ум. Во-первых, в таких ситуациях я обычно создаю отдельный массив с только главными значениями, чтобы я мог перебирать первый массив и просто использовать простую проверку in_array(). Во-вторых, если вы не хотите этого делать, вы можете сделать что-то, используя функцию array_walk_recursive() или некоторые из рекурсивных примеров в array_search(), чтобы пройти через ваш второй массив.

+0

Я пытаюсь использовать in_array ($ memberof, $ value, true), где $ memberof - это массив, а значение $ - самые глубокие вложенные массивы, но по какой-то причине это не работает? Работает ли in_array только на строках, если вы пытаетесь передать массив как иглу? –

+0

Я, я использовал его только для одномерных массивов - я не думаю, что он построен для сложных поисков. Вот почему нужен рекурсивный поиск массива. – Revent

+0

Что касается: in_array ($ memberof, $ value, true), где $ memberof - это массив, а значение $ - самые глубокие вложенные массивы - он должен * работать с использованием $ memberof в качестве иглы (предполагая PHP 4.2 или новее) но вы можете попробовать установить третье значение в значение false, чтобы он не выполнял строгий тип соответствия и будет соответствовать 1 с «1». Я должен увидеть, что ваш код знает, есть ли другая причина, почему он не работает. – Revent