2014-12-13 3 views
0

Как хороший разработчик php Я не решает эту проблему?Перегруппировка значений в двумерном массиве в php

Я потратил довольно много времени на то, как сократить двумерный массив.

$expanded = [ [1, 1], [1, 4], [3, 5], [1, 3], [4, 1], [4, 2], [1, 2], [4, 7], [3, 5] ]; 

в:

$shortened = [ [1, 10], [4, 10], [3, 10]; 

То, что я хочу есть, если первое значение двух массивов то же самое, объединить их!

Это то, что у меня ближе всего к тому, что я хочу:

$expanded = [ [1, 1], [1, 4], [3, 5], [1, 3], [2, 1], [2, 2], [1, 2], [2, 7], [3, 5] ]; 

$len = count($expanded); 

$shortened[0] = $expanded[0]; 

for ($i = 0; $i < $len; $i++) { 

    for ($j = 1; $j < $len-$i; $j++) { 

    if ($expanded[$i][0] == $expanded[$i+$j][0]) { 
     $shortened[$i][0] = $expanded[$i][0]; 
     $shortened[][1] = $shortened[$i][1] + $expanded[$i+$j][1]; 
    } else { 
     $shortened[$i+1] = $expanded[$i+$j]; 
    }   

    } 
} 
+1

Этот вопрос, как представляется, не по теме, потому что она принадлежит, чтобы http://codereview.stackexchange.com/ – Rizier123

ответ

0

Я получил это далеко в течение нескольких минут:

$expanded = [ [1, 1], [1, 4], [3, 5], [1, 3], [4, 1], [4, 2], [1, 2], [4, 7], [3, 5] ]; 

foreach ($expanded as $part) 
{ 
    $temp[$part[0]] += $part[1]; 
} 

foreach ($temp as $key => $value) 
{ 
    $shortened[] = [$key, $value]; 
} 

echo '<pre>'; 
print_r($shortened); 
echo '</pre>'; 

И это версия, которую я действительно использовал, потому что мой PHP < 5,4:

$expanded = array(array(1, 1), 
        array(1, 4), 
        array(3, 5), 
        array(1, 3), 
        array(4, 1), 
        array(4, 2), 
        array(1, 2), 
        array(4, 7), 
        array(3, 5)); 

foreach ($expanded as $part) 
{ 
    $temp[$part[0]] += $part[1]; 
} 

foreach ($temp as $key => $value) 
{ 
    $shortened[] = array($key, $value); 
} 

echo '<pre>'; 
print_r($shortened); 
echo '</pre>'; 

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

foreach ($expanded as $p) $t[$p[0]] += $p[1]; 
foreach ($t as $k => $v) $shortened[] = [$k,$v]; 
1
$shortened = array_reduce(
    $expanded, 
    function (array $carry, array $item) { 
     list($one, $two) = $item; 
     if (! isset($carry[$one])) { 
      $carry[$one] = [ $one, 0 ]; 
     } 
     $carry[$one][1] += $two; 
     return $carry; 
    }, 
    [] 
); 
+0

Просмотр Кода Потрясающе! У меня нет достаточной репутации для голосования, но когда я это сделаю, я вернусь, чтобы проголосовать за это. – Sebabouche

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