У меня два массива
они похожи
$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'];
Но это похоже на много ненужных итераций.
Есть ли способ лучше?
$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
только один раз 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);
Но это, вероятно, не обязательно 🙂