У меня есть это два массива:
$arr1=array( array("id" => 8, "name" => "test1"),
array("id" => 4, "name" => "test2"),
array("id" => 3, "name" => "test3")
);
$arr2=array( array("id" => 3),
array("id" => 4)
);
Как я могу "извлечь" массивы из $arr1, где идентификатор имеет то же значение в $arr2, в новый массив и оставляет извлеченный массив также в новом массиве, не принимая во внимание ключевые заказы?
Вывод, который я ищу, должен быть:
$arr3=array(
array("id" => 8, "name" => "test1")
);
$arr4=array( array("id" => 4, "name" => "test2"),
array("id" => 3, "name" => "test3")
);
Спасибо
Я уверен, что есть несколько готовых функций волшебного массива, которые могут справиться с этим, но вот простой пример:
$ids = array();
foreach($arr2 as $arr) {
$ids[] = $arr['id'];
}
$arr3 = $arr4 = array();
foreach($arr1 as $arr) {
if(in_array($arr['id'], $ids)) {
$arr4[] = $arr;
} else {
$arr3[] = $arr;
}
}
Результат будет таким же, как тот, который вам нужен. Живой пример:
Вы можете использовать array_udiff ()
и array_uintersect ()
с пользовательской функцией сравнения.
function cmp($a, $b) {
return $a['id'] - $b['id'];
}
$arr3 = array_udiff($arr1, $arr2, 'cmp');
$arr4 = array_uintersect($arr1, $arr2, 'cmp');
Думаю, это может оказаться медленнее, чем другой ответ, так как массивы будут перебираться дважды.