Группировать массив по значению ключа - PullRequest
0 голосов
/ 14 сентября 2011

Я искал вокруг, и я нахожусь в своем уме, поэтому я сделаю это легко.Это то, что я имею в print_r:

Array
(
    [0] => Array
        (
            [name] => client interaction
            [y] => 2.7
        )

    [1] => Array
        (
            [name] => client interaction
            [y] => 0.1
        )

    [2] => Array
        (
            [name] => project planning
            [y] => 0.1
        )

    [3] => Array
        (
            [name] => client interaction
            [y] => 5.9
        )

)

И это то, что я хочу, чтобы это было:

Array
(
    [0] => Array
        (
            [name] => client interaction
            [y] => 8.7
        )

    [1] => Array
        (
            [name] => project planning
            [y] => 0.1
        )

)

Ответы [ 3 ]

4 голосов
/ 14 сентября 2011

Абсолютно необходимо, чтобы ваш требуемый массив использовал числовые индексы?Если бы я сделал это, я бы сделал это так (не так, как желаемый массив)

$newArray = array();
foreach($array as $item)
{
  if(!isset($newArray[$item["name"]]))
    $newArray[$item["name"]] = 0;

  $newArray[$item["name"]] += $item["y"];
}

Это даст вам массив этой структуры:

Array
(
  [client interaction] => 8.7
  [project planning] => 0.1
)

Чтобы вернуть ключи, просто используйте вторую форму foreach loop

foreach($newArray as $name => $y)

$name, которая будет содержать name и $y y в исходном массиве.

2 голосов
/ 14 сентября 2011
$hash = array();
foreach ($sourceArray as $key=>$value) {
   $y = 0;
   if (isset($hash{$value{'name'}})) {
      $y = $hash{$value{'name'}};
   }

   $hash{$value{'name'}} = $y + $value{'y'};
}

$result = array();
foreach ($hash as $key => $value) {
  $result[] = array( 'name' => $key, 'value' => $value );
}
print_r($result);

Последний цикл просто для получения $hash в указанном вами формате.


Объяснение:

$hash

Временная структура, используемая для вычислениясуммы для каждого уникального имени.

foreach ($sourceArray as $key=>$value) {

Он проходит через ваш исходный массив ($ sourceArray) и извлекает каждый элемент.

   $y = 0;

Инициализирует переменную для хранения текущей суммы, котораяпринадлежит с этим именем.

   if (isset($hash{$value{'name'}})) {

Проверяет, было ли уже сохранено значение в $hash для данного имени.

      $y = $hash{$value{'name'}};
   }

Устанавливает $ y в ранее вычисленную суммудля данного имени, если оно было.

   $hash{$value{'name'}} = $y + $value{'y'};
}

Сохраняет сумму для данного имени в нашей временной структуре $hash.

 $result = array();
    foreach ($hash as $key => $value) {
      $result[] = array( 'name' => $key, 'value' => $value );
    }

преобразует $ hash в формат, который вытребуемый.

empy [] в $result[] = ... добавляет правую часть выражения к концу массива $result.

0 голосов
/ 14 сентября 2011
$mixed = array(); // Should contain your array shown above
$groups = array();
$newArray = array(); // Will contain your new array
$counter = 0;

foreach( $mixed as $mix )
{
    if ( isset($groups[$mix['name']]) )
    {
        $newArray[$groups[$mix['name']]]['y'] += $mix['y'];
    }
    else
    {
        $groups[$mix['name']] = $counter;
        $newArray[] = $mix;
        $counter++;
    }
}

http://codepad.org/EjdHxgvt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...