Сравните два ассоциативных массива и создайте новый массив с подобранными массивами, PHP

У меня есть это два массива:

$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")  
           );

Спасибо

7
задан tdecs 21 May 2010 в 12:18
поделиться

2 ответа

Я уверен, что есть несколько готовых функций волшебного массива, которые могут справиться с этим, но вот простой пример:

$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;
    }
}

Результат будет таким же, как тот, который вам нужен. Живой пример:

http://codepad.org/c4hOdnIa

6
ответ дан 7 December 2019 в 03:12
поделиться

Вы можете использовать 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');

Думаю, это может оказаться медленнее, чем другой ответ, так как массивы будут перебираться дважды.

3
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: