Как вы можете сделать многомерный массив уникальным? - PullRequest
11 голосов
/ 03 января 2011

У меня есть настройка многомерного массива, такая как:

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"
  )
)

Каков наилучший способ поиска в области дубликатов значений в «имени» и удаления их, чтобы каждое значениев многомерном массиве уникален?

Заранее спасибо!

Ответы [ 6 ]

27 голосов
/ 03 января 2011

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

$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

8 голосов
/ 03 января 2011

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

$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"
  }
}
5 голосов
/ 04 июля 2014
$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");
0 голосов
/ 25 мая 2017

Гораздо более простое решение для вашего многомерного массива.

$unique = array_map('unserialize', array_unique(array_map('serialize', $array)));

echo "<pre>";
print_r($unique);
0 голосов
/ 06 апреля 2017
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 колонны.

0 голосов
/ 03 января 2011

Если посмотреть на ваш конкретный случай, я бы порекомендовал использовать хеш-таблицу вместо 2-мерного массива.Если вы используете свое «имя» в качестве ключа в хэше, каждая запись будет уникальной.

Есть ли особая необходимость в многомерном массиве?

...