2013-06-07 1 views
1

Если бы кто-нибудь мог мне помочь здесь, я был бы бесконечно благодарен, так как провел около двух полных дней, пытаясь заставить это работать. Я хочу взять два многомерных массива и сравнить их, затем удалить любые дубликаты записей.PHP Многомерные массивы - удалить дубликаты

Сценарий: Значения в массиве2 уже были присвоены профилю пользователя. Значения в массиве 1 - это ВСЕ доступные значения, которые пользователь может выбрать. Я хочу, чтобы сравнить два, так что только те уже не назначены, приведены в качестве опции (слева в массиве) ...

$array1 = array(
    [0] => array([id] => 3 [name] => Eye Colour) 
    [1] => array([id] => 1 [name] => Hair Colour) 
    [2] => array([id] => 5 [name] => Hair Length) 
    [3] => array([id] => 4 [name] => Height) 
); 

$array2 = array(
    [0] => array([attribute_id] => 3 [name] => Eye Colour [active] => 1) 
    [1] => array([attribute_id] => 5 [name] => Hair Length [active] => 1)) 
); 

array_diff РНР() функция не работает с многомерными массивами, и я «у нас был хороший поиск, но он не может найти ничего, что сработает для меня!

В результате на основе вышеуказанных двух массивов должны быть:

$array1 = array(
    [0] => array([id] => 1 [name] => Hair Colour) 
    [1] => array([id] => 4 [name] => Height) 
); 

[АКТИВНЫЙ] поле не имеет значения, так что я просто нужно, чтобы сравнить идентификатор и поля Имя. Я понимаю, что имя двух полей id отличается, но было бы больно их изменять, поскольку они являются именами столбцов базы данных.

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

Пожалуйста, помогите. Я куплю тебе много пива! :)

Спасибо, Стив

ответ

2

Я не знаю, как сделать это с любой встроенной функции PHP, но вот обычай один:

$array1 = array(
    array('id' => 3, 'name' => 'Eye Colour'), 
    array('id' => 1, 'name' => 'Hair Colour'), 
    array('id' => 5, 'name' => 'Hair Length'), 
    array('id' => 4, 'name' => 'Height'), 
); 

$array2 = array(
    array('attribute_id' => 3, 'name' => 'Eye Colour', 'active' => 1), 
    array('attribute_id' => 5, 'name' => 'Hair Length', 'active' => 1) 
); 

// function to remove duplicates 
function myArrayDiff($array1, $array2) { 
    // loop through each item on the first array 
    foreach ($array1 as $key => $row) { 
     // loop through array 2 and compare 
     foreach ($array2 as $key2 => $row2) { 
      if ($row['id'] == $row2['attribute_id']) { 
       // if we found a match unset and break out of the loop 
       unset($array1[$key]); 
       break; 
      } 
     } 
    } 

    return array_values($array1); 
} 

$array3 = myArrayDiff($array1, $array2); 

print_r($array3); 

/* result: 
    Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [name] => Hair Colour 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Height 
      ) 

    ) 
*/ 
+0

Привет Крис, спасибо большое за не торопясь написать это - он отлично работает и именно то, что мне нужно. Я не уверен, есть ли более эффективный способ сделать это? Я просто знаю, что он будет циклически перемещаться через $ array2 несколько раз, что может немного отстать, когда есть большая пользовательская база. Тем не менее, я очень благодарен за ваше время и знания. Большое спасибо, Steve – SigmaSteve

+0

Спасибо! Его 1ам здесь и тысячи строк кода позже, ваше решение - единственное, что на самом деле делает то, что он должен и имеет хорошие комментарии! –

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

  • Нет связанных вопросов^_^