2013-02-15 5 views
-1

Я пытаюсь сгладить массив, чтобы дубликаты были удалены, а уникальные значения сохранены. Например:PHP flatten массив с повторяющимися значениями

$places = array( 
    array("United Kingdom","London","Camden","1"), 
    array("United Kingdom","London","Camden","5"), 
    array("United Kingdom","London","Camden","23"), 
    array("United Kingdom","London","Camden","71") 
); 

бы стать:

$places = array("United Kingdom","London","Camden","1,5,23,71"); 

или

$places = array('Country' => 'United Kingdom', 
       'County' => 'London', 
       'City' => 'Camden', 
       'Codes' => array(1,5,23,71) 
     ); 
+0

Для того, чтобы тот, кто отмечен меня на вопрос, было бы неплохо знать, куда я пошел неправильно с ним, так что я знаю, в будущем. – iltdev

+0

Не мой нисходящий, но у этого вопроса есть как минимум две проблемы: а) нет доказательств попытки решить проблему с вашей стороны и b) не сформулировано так, чтобы сделать ее полезной для других. – Jon

+0

Достаточно честный. Но его трудно объяснить новичкам. В следующий раз я обязательно стану неудачными попытками решить эту проблему. Привет, Джон. – iltdev

ответ

2

Поскольку все значения в ваших элементах массива являются строками, вы можете использовать их как часть ключа массива для удобства. Таким образом, это возможное решение:

$temp = array(); 
foreach($places as $items) { 
    $id = array_pop($items); 
    $key = serialize($items); 
    $temp[$key][] = $id; 
} 

$result = array(); 
foreach($temp as $k => $ids) { 
    $result[] = array_merge(unserialize($k), array($ids)); 
} 

Это очень выгодно для удобства, но оно довольно короткое.

See it in action.

+0

Большое спасибо, Джон. Ваше решение отлично работало для меня. Спасибо также за пример кода. Я заберу его сейчас и попытаюсь научиться этому :) – iltdev

1

В три этапа:

  • Во-первых, собрать информацию по индексам

  • Затем используйте array_unique для уникальных значений

  • Наконец соединить три массива в один большой.

Код

$places = array( 
    array("United Kingdom","London","Camden","1"), 
    array("United Kingdom","London","Camden","5"), 
    array("United Kingdom","London","Camden","23"), 
    array("United Kingdom","London","Camden","71") 
); 

foreach ($places as $p) { 
    for ($i=0; $i<count($p); $i++) { 
     $t[$i][]=$p[$i]; 
    } 
} 

for ($i=0; $i<count($t); $i++) { 
    $new[$i]= implode(",", array_unique($t[$i])); 
} 

$result=array_merge($new); 

Пример

print_r($result); 

Array ([0] => United Kingdom [1] => London [2] => Camden [3] => 1,5,23,71) 
+0

Как 'array_unique' собирается здесь помочь? Он сравнивает значения как * строки *. – Jon

+0

Это действительно помогает. См. Сначала я предлагаю получить массив для каждого столбца. – fedorqui

+0

Спасибо, fedorqui. Приятно получить несколько разных подходов к решению. Я планирую пройти через каждый и выяснить, как все это работает :) – iltdev

0

Использование array_unique(), как, например, для:

$places = array( 
array("United Kingdom","London","Camden","1"), 
array("United Kingdom","London","Camden","5"), 
array("United Kingdom","London","Camden","23"), 
array("United Kingdom","London","Camden","71") 
); 

echo "<pre>"; 
print_r(array_unique($places)); 

o/p 


Array 
(
    [0] => Array 
    (
     [0] => United Kingdom 
     [1] => London 
     [2] => Camden 
     [3] => 1 
    ) 
) 

Надеюсь, это поможет!

0
$places = array( 
    array("United Kingdom","London","Camden","1"), 
    array("United Kingdom","London","Camden","5"), 
    array("United Kingdom","London","Camden","23"), 
    array("United Kingdom","London","Camden","71") 
); 

$result = array(); 
foreach($places as $val){ 
    $result['Country'][$val[0]] = $val[0]; 
    $result['County'][$val[1]] = $val[1]; 
    $result['City'][$val[2]] = $val[2]; 
    $result['Codes'][$val[3]] = $val[3]; 
} 
$final = array(); 
foreach($result as $key=>$value){ 
    $final[$key] = implode(",",$value); 
} 

echo "<pre>"; 
print_r($final); 

Выход:

Array 
(
    [Country] => United Kingdom 
    [County] => London 
    [City] => Camden 
    [Codes] => 1,5,23,71 
) 
+0

Отметьте этот ответ, он удовлетворит ваши требования. –

+0

Спасибо, Прашант. Это прекрасное решение. Я был на полпути к этому как к самому решению. Еще раз спасибо. – iltdev

+0

@iltdev: cool: D –

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