У меня есть многомерная настройка массива, например:
array( [0]=> array( ["name"]=> "Foo" ["slug"]=> "Bar" ) [1]=> array( ["name"]=> "Foo" ["slug"]=> "Bar" ) [2]=> array( ["name"]=> "Test 1" ["slug"]=> "test-1" ) [3]=> array( ["name"]=> "Test 2" ["slug"]=> "test-2" ) [4]=> array( ["name"]=> "Test 3" ["slug"]=> "test-3" ) )
Каким будет наилучший способ поиска по области для дублирования значений в «имени» и удалить их, чтобы каждое значение в многомерном массиве было уникальным?
Заранее спасибо!
Поскольку каждый, у кого есть альтернативы, вот решение проблемы. Иногда нам приходится работать с данными, которые у нас есть, а не перестраивать их так, как нам нравится. При этом будет удалено все последующие записи из массива, которые являются дубликатами.
$array = Array( Array( 'name' => 'Test 3', 'slug' => 'test-3' ), Array( 'name' => 'Foo', 'slug' => 'Bar' ), Array( 'name' => 'Foo', 'slug' => 'Bar' ), Array( 'name' => 'Test 1', 'slug' => 'test-1' ), Array( 'name' => 'Test 2', 'slug' => 'test-2' ), Array( 'name' => 'Test 3', 'slug' => 'test-3' ), ); var_dump($array); for ($e = 0; $e < count($array); $e++) { $duplicate = null; for ($ee = $e+1; $ee < count($array); $ee++) { if (strcmp($array[$ee]['name'],$array[$e]['name']) === 0) { $duplicate = $ee; break; } } if (!is_null($duplicate)) array_splice($array,$duplicate,1); } var_dump($array);
Это будет выглядеть так:
array(6) { [0]=> array(2) { ["name"]=> string(6) "Test 3" ["slug"]=> string(6) "test-3" } [1]=> array(2) { ["name"]=> string(3) "Foo" ["slug"]=> string(3) "Bar" } [2]=> array(2) { ["name"]=> string(3) "Foo" ["slug"]=> string(3) "Bar" } [3]=> array(2) { ["name"]=> string(6) "Test 1" ["slug"]=> string(6) "test-1" } [4]=> array(2) { ["name"]=> string(6) "Test 2" ["slug"]=> string(6) "test-2" } [5]=> array(2) { ["name"]=> string(6) "Test 3" ["slug"]=> string(6) "test-3" } } array(4) { [0]=> array(2) { ["name"]=> string(6) "Test 3" ["slug"]=> string(6) "test-3" } [1]=> array(2) { ["name"]=> string(3) "Foo" ["slug"]=> string(3) "Bar" } [2]=> array(2) { ["name"]=> string(6) "Test 1" ["slug"]=> string(6) "test-1" } [3]=> array(2) { ["name"]=> string(6) "Test 2" ["slug"]=> string(6) "test-2" } }
Вы можете использовать ассоциативный массив.
$temp_array = array(); foreach ($array as &$v) { if (!isset($temp_array[$v['name']])) $temp_array[$v['name']] =& $v; }
Это создает временный массив, используя ключ $v['name']
. Если уже есть элемент с тем же ключом, он не добавляется во временный массив.
Вы можете преобразовать ассоциативный массив обратно в последовательный массив, используя
$array = array_values($temp_array);
Пример кода и вывода: http://codepad.org/zHfbtUrl
$array = array( 0 => array( "name"=> "Foo", "slug"=> "Bar" ), 1 => array( "name"=> "Foo", "slug"=> "Bar" ), 2 => array( "name"=> "Test 1", "slug"=> "test-1" ), 3 => array( "name"=> "Test 2", "slug"=> "test-2" ), 4 => array( "name"=> "Test 3", "slug"=> "test-3" ) ); function array_unique_by_key (&$array, $key) { $tmp = array(); $result = array(); foreach ($array as $value) { if (!in_array($value[$key], $tmp)) { array_push($tmp, $value[$key]); array_push($result, $value); } } return $array = $result; } array_unique_by_key($array, "name");
Просто посмотрев на ваш конкретный случай, я бы рекомендовал использовать хеш-таблицу вместо 2-мерного массива. Если вы используете свое «имя» в качестве ключа в хэше, каждая запись будет уникальной.
Есть ли необходимость в многомерном массиве?
function multi_array_unique_by_value($array, $colon = '') { $ret_array = array(); $has_array = array(); foreach($array as $item) { $item_array = (array)$item; if(!in_array($item_array[$colon], $has_array)) { array_push($ret_array, $item); array_push($has_array, $item_array[$colon]); } } return $ret_array; }
Вы можете указать свой массив здесь и дать имя двоеточия для создания уникального.
В этом коде у вас многомерная матрица, мы хотим, чтобы этот массив, для которого был указан индекс столбца, мы нажимаем эти значения столбца. И когда такое же значение, это не добавление возвращаемого массива.
Итак, это решение для array_unique для 1 coloumn.
Гораздо более простое решение для вашего многомерного массива.
$unique = array_map('unserialize', array_unique(array_map('serialize', $array))); echo "<pre>"; print_r($unique);