2014-09-24 6 views
2

У меня есть два массива, и мне нужно удалить из большего массива меньшеСравнить два массива и удалить массив из массива в PHP

$a = array(223 => 6, 381 => 6); 

и второй массивы является:

$b = array(array('id' => 45, 'username' => 'rock'), array('id' => 223, 'username' => 'pop'), array('id' => 381, 'username' => 'stock')); 

С print_r() они выглядят как этот

Array 
(
    [223] => 6 
    [381] => 6 
) 

Array 
(
    [0] => Array 
     (
      [id] => 45 
      [username] => rock 
     ) 

    [1] => Array 
     (
      [id] => 223 
      [username] => pop 
     ) 

    [2] => Array 
     (
      [id] => 381 
      [username] => stock 
     ) 

) 

Как удалить из $ B массива, в котором идентификатор! = $ A [ключи] Таким образом, в результате я волю час пр массив как этот

Array 
(
    [0] => Array 
     (
      [id] => 223 
      [username] => pop 
     ) 

    [1] => Array 
     (
      [id] => 381 
      [username] => stock 
     ) 

) 

я стараюсь использовать array_diff, array_search и снята с охраны, но не знаю, как заставить его работать.

ответ

6

Итак, вы хотите, чтобы отфильтровать значения, где нет $a[$sub_array["id"]] не существует, где $sub_array элемент $b:

Тогда array_filter() является то, что вы ищете:

$array = array_filter($b, function ($val) use ($a) { 
    return isset($a[$val["id"]]); 
}); 
+0

ваш Varian более чище, но он показывает эту ошибку array_filter() ожидает параметр 1, чтобы быть массив – Siada

+0

@ user3375344 правда, это потому, что я не уважаю порядок параметров; исправлено. – bwoebi

0
<?php 
$a = array(223 => 6, 381 => 6); 
$b = array(array('id' => 45, 'username' => 'rock'), array('id' => 223, 'username' => 'pop'), array('id' => 381, 'username' => 'stock')); 
$cc = 0; 
foreach($b as $bb) 
{ 
    $flag = 0; 
    foreach($a as $k => $aa) 
    { 
     if($bb['id'] == $k) 
     { 
      $flag=1; 
     } 
    } 
    if($flag == 0) 
    { 
     unset($b[$cc]); 
    } 
    $cc++; 
} 
print_r($b); 
1
$a = array(223 => 6, 381 => 6); 
    $b = array(array('id' => 45, 'username' => 'rock'), array('id' => 223, 'username' => 'pop'), array('id' => 381, 'username' => 'stock')); 
    $keys = array_keys($a); 
    $new_array = array(); 
    for ($i = 0, $len = count($b); $i < $len; $i++) { 
     $c = $b[$i]; 
     if (in_array($c['id'], $keys)) { 
      $new_array[] = $c; 
     } 
    } 
    var_dump($new_array); 
+0

да! это то, что мне нужно, идеально! Спасибо! – Siada

+0

Проверьте ответ bwoebi для более чистого подхода. –

+0

Действительно, я выбрал более ручной/образовательный ответ. – Jonathon

0

Вы хотите сначала использовать array_keys, чтобы получить все ключи от $ a. Затем перейдите через $ b и с in_array вы узнаете, является ли id ключом $ a. Наконец, используйте unset.

$a = array(223 => 6, 381 => 6); 
$aKey = array_keys($a); 
$b = array(array('id' => 45, 'username' => 'rock'), array('id' => 223, 'username' => 'pop'), array('id' => 381, 'username' => 'stock')); 
foreach ($b as $key => $value) 
    if (!in_array($value['id'], $aKey)) 
     unset($b[$key]); 
print_r($b); 
+0

'array_keys' устраняет необходимость в вашем первом цикле. –

+1

@ Крис Спасибо! Под редакцией! –

Смежные вопросы