2015-06-27 3 views
0

У меня есть 2 массивов:2 массивов: держать только элементы с различными значениями

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [fieldname] => banana 
      [value] => yellow 
     ) 
) 

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [fieldname] => rome 
      [value] => city 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [fieldname] => bla 
      [value] => yes 
     ) 
) 

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

Array 
(
    [0] => Array 
     (
      [id] => 2 
      [fieldname] => bla 
      [value] => yes 
     ) 

) 

[ID] => 2 был только разные [ID] поэтому я держу его.

Сказал, что мне уже удалось достичь своей цели с неэффективной кучей foreach, если утверждения и временные переменные. Я действительно не хочу использовать стенограмму кода для этой очень маленькой вещи, поэтому я начал искать собственную PHP-функцию без успеха. Какой самый простой способ получить результат? Возможно ли, что я строго должен использовать foreach с таким количеством, если?

+0

Когда вы говорите разные, вы говорите все значения являются уникальными или только идентификатор ? Вы хотите удалить элементы с дубликатами, как оригинал, так и дубликат? –

+0

классический способ обработки с помощью массива-поиска http://php.net/manual/en/function.array-search.php – Proxytype

ответ

0

Вы можете использовать array_udiff с функцией.

Вычисляет разницу в массивах с помощью функции обратного вызова для сравнения данных .

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


Код:

// Setup two arrays as per your question 
$array1 = array (

    '0' => array (
    'id' => '1', 
    'fieldname' => 'banana', 
    'value' => 'yellow', 
) 

); 

$array2 = array (

    '0' => array (
    'id' => '1', 
    'fieldname' => 'rome', 
    'value' => 'city', 
), 

    '1' => array (
    'id' => '2', 
    'fieldname' => 'bla', 
    'value' => 'yes', 
) 

); 

// Setup the callback comparison function 
function arrayCompare($array2, $array1) { 
    return $array2['id'] - $array1['id']; 
} 

// Use array_udiff() with the two arrays and the callback function 
$arrayDiff = array_udiff($array2, $array1, 'arrayCompare'); 
print_r($arrayDiff); 

Приведенный выше код возвращает следующее:

Array (

    [1] => Array (
    [id] => 2 
    [fieldname] => bla 
    [value] => yes 
) 

) 
+1

Damin it true! Обратный звонок был способом. Спасибо. – user1274113

0

Это должно быть сделано. Не очень короткий, и он использует временную переменную, поэтому, возможно, не то, что вы искали. Я назвал два массива one и two.

$ids = array(); 
$result = array(); 

foreach ($one as $x) { 
    $ids[$x['id']] = 1; //This way, isset($x['id']) vill return true 
} 

foreach ($two as $x) { 
    if (!isset($ids[$x['id']])) { 
     $result[] = $x; 
    } 
} 

Я был бы удивлен, если бы не было более компактного способа сделать это.

EDIT: Это альтернативный вариант с вложенными для каждого. Не особенно короткий.

$result = array(); 

foreach ($one as $x) { 
    foreach ($two as $y) { 
     if ($x['id'] == $y['id']) { 
      //A match, lets try the next $x 
      continue 2; 
     } 
    } 
    //No matching id in $two 
    $result[] = $x; 
} 
Смежные вопросы