Как удалить повторяющиеся значения из многомерного массива?

У меня есть данные массива из двух отдельных запросов mysql. Данные массива выглядят следующим образом:

0 : {user_id: 82, ac_type: 1,…} 1 : {user_id: 80, ac_type: 5,…} 2 : {user_id: 76, ac_type: 1,…} 3 : {user_id: 82, ac_type: 1,…} 4 : {user_id: 80, ac_type: 5,…} 

Я хочу удалить дублированные элементы массива.

Итак, мой результат будет таким:

 0 : {user_id: 82, ac_type: 1,…} 1 : {user_id: 80, ac_type: 5,…} 2 : {user_id: 76, ac_type: 1,…} 

Я хочу проверить дубликат user_id.

Я пробовал следующие решения, но ни один из них не работает по желанию.

$input = array_unique($res, SORT_REGULAR);

$input = array_map("unserialize", array_unique(array_map("serialize", $res)));

Я также пробовал ниже.

 $results = array(); foreach ($res as $k => $v) { $results[implode($v)] = $v; } $results = array_values($results); print_r($results); 

Но все же существуют повторяющиеся данные.

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

Код: ( Демо )

 $array=[ ['user_id'=>82,'ac_type'=>1], ['user_id'=>80,'ac_type'=>5], ['user_id'=>76,'ac_type'=>1], ['user_id'=>82,'ac_type'=>2], ['user_id'=>80,'ac_type'=>6] ]; var_export(array_values(array_column($array,NULL,'user_id'))); 

Вывод:

 array ( 0 => array ( 'user_id' => 82, 'ac_type' => 2, ), 1 => array ( 'user_id' => 80, 'ac_type' => 6, ), 2 => array ( 'user_id' => 76, 'ac_type' => 1, ), ) 

Если вы хотите сохранить первые вхождения и игнорировать все последующие дубликаты, это будет делать:

Код: ( Демо ) (* это сохраняет первые вхождения)

 $array=[ ['user_id'=>82,'ac_type'=>1], ['user_id'=>80,'ac_type'=>5], ['user_id'=>76,'ac_type'=>1], ['user_id'=>82,'ac_type'=>2], ['user_id'=>80,'ac_type'=>6] ]; foreach($array as $a){ if(!isset($result[$a['user_id']])){ $result[$a['user_id']]=$a; // only store first occurence of user_id } } var_export(array_values($result)); // re-index 

Вывод:

 array ( 0 => array ( 'user_id' => 82, 'ac_type' => 1, ), 1 => array ( 'user_id' => 80, 'ac_type' => 5, ), 2 => array ( 'user_id' => 76, 'ac_type' => 1, ), ) 

Если вы не возражаете потерять порядок своих подмассивов, вы можете использовать array_reverse() с array_column() чтобы сохранить первые вхождения с использованием временных ключей, а затем использовать array_values() для повторной индексации:

 var_export(array_values(array_column(array_reverse($array),NULL,'user_id'))); /* array ( 0 => array ( 'user_id' => 76, 'ac_type' => 1, ), 1 => array ( 'user_id' => 82, 'ac_type' => 1, ), 2 => array ( 'user_id' => 80, 'ac_type' => 5, ), ) */ 

Взял меня немного, но это должно сработать (объяснение в комментариях):

 <?php /* Example array */ $result = array( 0 => array( "user_id" => 82, "ac_type" => 1 ), 1 => array( "user_id" => 80, "ac_type" => 5 ), 2 => array( "user_id" => 76, "ac_type" => 1 ), 3 => array( "user_id" => 82, "ac_type" => 2 ), 4 => array( "user_id" => 80, "ac_type" => 2 ) ); /* Function to get the keys of duplicate values */ function get_keys_for_duplicate_values($my_arr, $clean = false) { if ($clean) { return array_unique($my_arr); } $dups = $new_arr = array(); foreach ($my_arr as $key => $val) { if (!isset($new_arr[$val])) { $new_arr[$val] = $key; } else { if (isset($dups[$val])) { $dups[$val][] = $key; } else { //$dups[$val] = array($key); $dups[] = $key; // Comment out the previous line, and uncomment the following line to // include the initial key in the dups array. // $dups[$val] = array($new_arr[$val], $key); } } } return $dups; } /* Create a new array with only the user_id values in it */ $userids = array_combine(array_keys($result), array_column($result, "user_id")); /* Search for duplicate values in the newly created array and return their keys */ $dubs = get_keys_for_duplicate_values($userids); /* Unset all the duplicate keys from the original array */ foreach($dubs as $key){ unset($result[$key]); } /* Re-arrange the original array keys */ $result = array_values($result); echo '<pre>'; print_r($result); echo '</pre>'; ?> с <?php /* Example array */ $result = array( 0 => array( "user_id" => 82, "ac_type" => 1 ), 1 => array( "user_id" => 80, "ac_type" => 5 ), 2 => array( "user_id" => 76, "ac_type" => 1 ), 3 => array( "user_id" => 82, "ac_type" => 2 ), 4 => array( "user_id" => 80, "ac_type" => 2 ) ); /* Function to get the keys of duplicate values */ function get_keys_for_duplicate_values($my_arr, $clean = false) { if ($clean) { return array_unique($my_arr); } $dups = $new_arr = array(); foreach ($my_arr as $key => $val) { if (!isset($new_arr[$val])) { $new_arr[$val] = $key; } else { if (isset($dups[$val])) { $dups[$val][] = $key; } else { //$dups[$val] = array($key); $dups[] = $key; // Comment out the previous line, and uncomment the following line to // include the initial key in the dups array. // $dups[$val] = array($new_arr[$val], $key); } } } return $dups; } /* Create a new array with only the user_id values in it */ $userids = array_combine(array_keys($result), array_column($result, "user_id")); /* Search for duplicate values in the newly created array and return their keys */ $dubs = get_keys_for_duplicate_values($userids); /* Unset all the duplicate keys from the original array */ foreach($dubs as $key){ unset($result[$key]); } /* Re-arrange the original array keys */ $result = array_values($result); echo '<pre>'; print_r($result); echo '</pre>'; ?> 

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

Вывод:

 Array ( [0] => Array ( [user_id] => 82 [ac_type] => 1 ) [1] => Array ( [user_id] => 80 [ac_type] => 5 ) [2] => Array ( [user_id] => 76 [ac_type] => 1 ) ) 

Протестированный и рабочий пример.

 <?php $details = array('0'=> array('user_id'=>'82', 'ac_type'=>'1'), '1'=> array('user_id'=>'80', 'ac_type'=>'5'), '2'=>array('user_id'=>'76', 'ac_type'=>'1'), '3'=>array('user_id'=>'82', 'ac_type'=>'1'), '4'=>array('user_id'=>'80', 'ac_type'=>'5')); function unique_multidim_array($array, $key) { $temp_array = array(); $i = 0; $key_array = array(); foreach($array as $val) { if (!in_array($val[$key], $key_array)) { $key_array[$i] = $val[$key]; $temp_array[$i] = $val; } $i++; } return $temp_array; } ?> <?php $details = unique_multidim_array($details,'user_id'); ?> <pre> <?php print_r($details); ?> </pre> 

Вывод:

 Array ( [0] => Array ( [user_id] => 82 [ac_type] => 1 ) [1] => Array ( [user_id] => 80 [ac_type] => 5 ) [2] => Array ( [user_id] => 76 [ac_type] => 1 ) ) 

взятый отсюда http://php.net/manual/en/function.array-unique.php в примечаниях пользователя.

 $array = [ ['user_id'=>82,'ac_type'=>1], ['user_id'=>80,'ac_type'=>5], ['user_id'=>76,'ac_type'=>1], ['user_id'=>82,'ac_type'=>2], ['user_id'=>80,'ac_type'=>6] ]; $array = array_reverse($array); $v = array_reverse( array_values( array_combine( array_column($array, 'user_id'), $array ) ) ); echo '<pre>'; var_dump($v); 

Результат:

 array(3) { [0]=> array(2) { ["user_id"]=> int(76) ["ac_type"]=> int(1) } [1]=> array(2) { ["user_id"]=> int(82) ["ac_type"]=> int(1) } [2]=> array(2) { ["user_id"]=> int(80) ["ac_type"]=> int(5) } }