значения массива в многомерном массиве

У меня два массива

они похожи

$a1 = array( array('num' => 1, 'name' => 'one'), array('num' => 2, 'name' => 'two'), array('num' => 3, 'name' => 'three'), array('num' => 4, 'name' => 'four'), array('num' => 5, 'name' => 'five') ) $a2 = array(3,4,5,6,7,8); 

Я хочу получить массив, который выглядит как

 $a3 = array(3,4,5); 

поэтому в основном, где $a1[$i]['num'] находится в $a2

Я знаю, что могу

 $a3 = array(); foreach($a1 as $num) if(array_search($num['num'], $a2)) $a3[] = $num['num']; 

Но это похоже на много ненужных итераций.

Есть ли способ лучше?


Ah Snap …
Я просто понял, что задал этот вопрос неправильно, я хочу, чтобы в итоге появился массив, похожий на

 $a3 array( array('num' => 3, 'name' => 'three'), array('num' => 4, 'name' => 'four'), array('num' => 5, 'name' => 'five') ) 

Вы можете извлечь соответствующую информацию ( 'num' ) из $a1 :

 $a1_bis = array(); foreach ($a1 as $a) { $a1_bis[] = $a['num']; } 

И затем используйте array_intersect() чтобы найти то, что находится в $a1_bis и $a2 :

 $result = array_intersect($a1_bis, $a2); var_dump($result); 

Который доставит вас:

 array 2 => int 3 3 => int 4 4 => int 5 

С помощью этого решения:

  • вы проходите через $a1 только один раз
  • вы доверяете PHP на использовании хорошего алгоритма для поиска пересечения между двумя массивами (и / или считаете, что функция, разработанная на C, вероятно, будет быстрее, чем любой эквивалент, который вы могли бы кодировать в чистом-PHP)


EDIT после комментария: ну, учитывая результат, который вы хотите, теперь я бы пошел с другим подходом.

Во-первых, я бы использовал array_flip() чтобы перевернуть массив $a2 , чтобы обеспечить быстрый доступ к его элементам (доступ по ключу намного быстрее, чем поиск значения) :

 $a2_hash = array_flip($a2); // To speed things up : // accessing by key is way faster than finding // an item in an array by value 

Затем я бы использовал array_filter() чтобы применить фильтр к $a1 , сохраняя элементы, для которых num находится в перевернутом массиве $a2_hash :

 $result = array_filter($a1, function ($item) use ($a2_hash) { if (isset($a2_hash[ $item['num'] ])) { return true; } return false; }); var_dump($result); 

Примечание. Я использовал анонимную функцию, которая существует только с PHP> = 5.3; если вы используете PHP <5.3, этот код может быть повторно обработан для подавления закрытия.

При этом я получаю требуемый массив:

 array 2 => array 'num' => int 3 'name' => string 'three' (length=5) 3 => array 'num' => int 4 'name' => string 'four' (length=4) 4 => array 'num' => int 5 'name' => string 'five' (length=4) 

Обратите внимание, что ключи не соответствуют чему-либо полезному – если вы хотите их удалить , просто используйте array_values() для этого $result :

 $final_result = array_values($result); 

Но это, вероятно, не обязательно 🙂