2010-10-13 2 views
0

У меня есть массив элементов:Сопоставление значения массива с помощью ключа в PHP

array(
    [0] => array(
    'item_no' => 1 
    'item_name' => 'foo 
) 
    [1] => array(
    'item_no' => 2 
    'item_name' => 'bar' 
) 
) etc. etc. 

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

array(
    [0] => array(
    'item_no' => 1 
) 
    [1] => array(
    'item_no' => 100 
) # should be removed as not in 1st array 

Как бы я искать первый массив, используя каждый элемент второго массива, как (в псевдокоде):

если «Номер элемента» == х в 1-ом массиве продолжают еще удалить его из 2-го массива ,

ответ

0

Вы также можете сделать:

$my_array =array(
    0 => array('item_no' => 1,'item_name' => 'foo'), 
    1 => array('item_no' => 2,'item_name' => 'bar') 
); 

$thrid_party_array = array(
    0 => array('item_no' => 1), 
    1 => array('item_no' => 100), 
); 

$temp = array(); // create a temp array to hold just the item_no 
foreach($my_array as $key => $val) { 
     $temp[] = $val['item_no']; 
} 

// now delete those entries which are not in temp array. 
foreach($thrid_party_array as $key => $val) { 
     if(!in_array($val['item_no'],$temp)) { 
       unset($thrid_party_array[$key]); 
     } 
} 

Working link

+0

Большое спасибо, это один очень подходит для моего приложение, тем более, что в любом случае мне понадобится массив «item_no». – 2010-10-13 16:59:16

0

Если ваш ключ не на самом деле ключ вашего массива, но значение, вам, вероятно, нужно сделать линейный поиск:

foreach ($itemsToRemove as $itemToRemove) { 
    foreach ($availableItems as $key => $availableItem) { 
     if ($itemToRemove['item_no'] === $availableItem['item_no']) { 
      unset($availableItems[$key]); 
     } 
    } 
} 

Конечно, было бы проще, если бы Номер элемента также ключ элементы массива, как:

$availableItems = array(
    123 => array(
    'item_no' => 123, 
    'item_name' => 'foo' 
), 
    456 => array(
    'item_no' => 456, 
    'item_name' => 'bar' 
) 
); 

с этим вы можете использовать один foreach и удалять элементы с помощью их ключей:

foreach ($itemsToRemove as $itemToRemove) { 
    unset($availableItems[$itemToRemove['item_no']]); 
} 

Вы можете использовать следующие построить отображение Номер элемента вашим фактическим ключам массива:

$map = array(); 
foreach ($availableItems as $key => $availableItem) { 
    $map[$availableItems['item_no']] = $key; 
} 

Затем вы можете использовать следующие использовать отображение, чтобы удалить соответствующий элемент массива:

foreach ($itemsToRemove as $itemToRemove) { 
    unset($availableItems[$map[$itemToRemove['item_no']]]); 
} 
1
// Returns the item_no of an element 
function get_item_no($arr) { return $arr['item_no']; } 

// Arrays of the form "item_no => position in the array" 
$myKeys = array_flip(array_map('get_item_no', $myArray)); 
$theirKeys = array_flip(array_map('get_item_no', $theirArray)); 

// the part of $theirKeys that has an item_no that's also in $myKeys 
$validKeys = array_key_intersect($theirKeys, $myKeys); 

// Array of the form "position in the array => item_no" 
$validPos = array_flip($validKeys); 

// The part of $theirArray that matches the positions in $validPos 
$keptData = array_key_intersect($theirArray, $validPos); 

// Reindex the remaining values from 0 to count() - 1 
return array_values($keptData); 

Все это было бы проще, если бы, вместо того, чтобы хранить ключ в элементах, вы сохранили его в качестве ключа массива (то есть, вы» d использовать массивы в форме "Номер элемента => item_data"):

// That's all there is to it 
return array_key_intersect($theirArray, $myArray); 
Смежные вопросы