2013-12-16 2 views
2

Мне нужно удалить повторяющиеся значения из массива.Дедупликация значений многомерного массива

$original_array

Array 
(
    [0] => 1 500 2 4 100 51 52 
    [1] => 515 5 500 
    [2] => 31 351 5 51 61 71 81 91 
    [3] => 1 57 101 
    [4] => 191 25 101 102 
) 

Я думал, что я тогда быть в состоянии взорвать их пространства, чтобы создать многомерный массив, а затем использовать array_unique() но это не работает.

# Create new array 
$new_array = array(); 

# Loop through original_array 
foreach($original_array as $original_array_value) 
{ 
    $new_array[] = explode(' ', $original_array_value); 
} 
print_r($new_array); 

Выход:

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 500 
      [2] => 2 
      [3] => 4 
      [4] => 100 
      [5] => 51 
      [6] => 52 
     ) 

    [1] => Array 
     (
      [0] => 515 
      [1] => 5 
      [2] => 500 
     ) 

    [2] => Array 
     (
      [0] => 31 
      [1] => 351 
      [2] => 5 
      [3] => 51 
      [4] => 61 
      [5] => 71 
      [6] => 81 
      [7] => 91 
     ) 

    [3] => Array 
     (
      [0] => 1 
      [1] => 57 
      [2] => 101 
     ) 

    [4] => Array 
     (
      [0] => 191 
      [1] => 25 
      [2] => 101 
      [3] => 102 
     ) 

) 

Конечный результат массив не имеет значения для меня, пока нет повторяющихся значений.

+0

Не уверен, является ли пятнистый вы [мой ответ] (http://stackoverflow.com/a/20604756/1338292) в здесь, но вы может захотеть дать это попробовать :) –

+0

@jack Я просто заметил это, и я ценю альтернативу, но я думаю, что ответ gwillie лучше для производительности. – Draven

+0

Я могу сказать вам, что разница в производительности незначительна и в мою пользу, если вы беспокоились об этом :) Одна из причин заключается в том, что 'array_unique()' необходимо выполнить сортировку в первую очередь. –

ответ

2

Как насчет :

$arr = array(
    0 => '1 500 2 4 100 51 52', 
    1 => '515 5 500', 
    2 => '31 351 5 51 61 71 81 91', 
    3 => '1 57 101', 
    4 => '191 25 101 102', 
); 

$imp = trim(implode(' ',$arr)); 
$exp = array_unique(explode(' ', $imp)); 
var_dump($exp); 

ВЫВОД

Array 
(
    [0] => 1 
    [1] => 500 
    [2] => 2 
    [3] => 4 
    [4] => 100 
    [5] => 51 
    [6] => 52 
    [7] => 515 
    [8] => 5 
    [10] => 31 
    [11] => 351 
    [14] => 61 
    [15] => 71 
    [16] => 81 
    [17] => 91 
    [19] => 57 
    [20] => 101 
    [21] => 191 
    [22] => 25 
    [24] => 102 
) 
+1

Очень элегантный - это самый простой способ сделать это. –

+0

Фантастический! Благодаря! – Draven

2

Вы на полпути. Добавьте это к концу кода:

$final_array = array(); 
foreach($new_array as $index => $subarray) { 
    $final_array = array_merge($final_array, $subarray); 
} 
$final_array = array_unique($final_array); 

Тогда код выглядит следующим образом:

$original_array = array(
    '1 500 2 4 100 51 52', 
    '515 5 500', 
    '31 351 5 51 61 71 81 91', 
    '1 57 101', 
    '191 25 101 102' 
    ); 

# Create new array. 
$new_array=array(); 

# Loop through original_array. 
foreach($original_array as $original_array_value) 
{ 
    $new_array[]=explode(' ', $original_array_value); 
} 
$final_array = array(); 
foreach($new_array as $index => $subarray) { 
    $final_array = array_merge($final_array, $subarray); 
} 
$final_array = array_unique($final_array); 

echo "<pre>"; 
print_r($final_array); 
echo "</pre>"; 

Еще лучше: объединить шаги, например, так:

$original_array = array(
    '1 500 2 4 100 51 52', 
    '515 5 500', 
    '31 351 5 51 61 71 81 91', 
    '1 57 101', 
    '191 25 101 102' 
    ); 

# Create new array. 
$final_array =array(); 

# Loop through original_array and do the merge at the same time. 
foreach($original_array as $original_array_value) 
{ 
    $final_array = array_merge($final_array, explode(' ', $original_array_value)); 
} 
$final_array = array_unique($final_array); 

echo "<pre>"; 
print_r($final_array); 
echo "</pre>"; 
+1

Perfect hat fit :) –

+0

array_merge перезапишет предыдущее значение ключа последним, я исправлю – Sundar

+0

С строковыми клавишами, да. С цифровыми клавишами нет. http://www.php.net/array_merge –

1

Вместо использования array_unique() вы можете создать уникальный массив сразу:

$arr = array(
    0 => '1 500 2 4 100 51 52', 
    1 => '515 5 500', 
    2 => '31 351 5 51 61 71 81 91', 
    3 => '1 57 101', 
    4 => '191 25 101 102', 
); 

$result = array(); 

foreach ($arr as $item) { 
     $result += array_flip(explode(' ', $item)); 
} 

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

print_r(array_keys($result)); 
Смежные вопросы