Слияние и группировка данных массива - PullRequest
3 голосов
/ 12 августа 2010

Как сгруппировать это:

Array(
      [0] => Array(
                  [brand] => 'ABC',
                  [model] => 'xyz',
                  [size] => 13
      )
      [1] => Array(
                  [brand] => 'QWE',
                  [model] => 'poi',
                  [size] => 23
      )
      [2] => Array(
                  [brand] => 'ABC',
                  [model] => 'xyz',
                  [size] => 18
      ) )

в это:

Array(
      [0] => Array(
                  [brand] => 'ABC',
                  [model] => 'xyz',
                  [size] => Array(
                                 13,
                                 18
                            )
      )
      [1] => Array(
                  [brand] => 'QWE',
                  [model] => 'poi',
                  [size] => 23
      ) )

Я хочу сгруппировать по BRAND и MODEL, но вставить массив в РАЗМЕР, так как этот не тот.

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

С точки зрения алгоритма вам просто необходимо:

  1. Создать пустой массив.

  2. Сканирование каждого элемента массива в исходном массиве, создание нового элемента (в пустом массиве) для каждой обнаруженной новой марки / модели и добавление подмассива размера.

  3. Если запись о бренде / модели уже существует, просто добавьте размер к подмассиву, если его еще нет.

Вы можете реализовать это следующим образом (грубо, но это работает):

<?php
    // Test data.
    $sourceArray = array(array('brand'=>'ABC', 'model'=>'xyz', 'size'=>13),
                         array('brand'=>'QWE', 'model'=>'poi', 'size'=>23),
                         array('brand'=>'ABC', 'model'=>'xyz', 'size'=>18),
                        );
    $newArray = array();

    // Create a new array from the source array. 
    // We'll use the brand/model as a lookup.
    foreach($sourceArray as $element) {

        $elementKey = $element['brand'] . '_' . $element['model'];

        // Does this brand/model combo already exist?
        if(!isset($newArray[$elementKey])) {
            // No - create the new element.
            $newArray[$elementKey] = array('brand'=>$element['brand'],
                                           'model'=>$element['model'], 
                                           'size'=>array($element['size']),
                                           );
        }
        else {
            // Yes - add the size (if it's not already present).
            if(!in_array($element['size'], $newArray[$elementKey]['size'])) {
                $newArray[$elementKey]['size'][] = $element['size'];
            }
        }
    }

    // *** DEBUG ***
    print_r($newArray);
?>

Кстати, для простоты доступа я сделал так, чтобы подмассив size всегда был массивом. (т. е. вы не должны допускать, чтобы он потенциально был только элементом.)

0 голосов
/ 12 августа 2010

"Upgrade" до фрагмента knarf ....

foreach($array as $item) {
  $itemname = $item["brand"] . "_" . $item["model"]

  $new_array[$itemname]["brand"]  = $item["brand"];
  $new_array[$itemname]["model"]  = $item["model"];
  $new_array[$itemname]["size"][ $item["size"] ] = 1;
}

foreach($new_array as $itemname=>$data) {
  if(isset($data['size']) && is_array($data['size'])) {
    $new_array[$itemname]['size']=array_keys($new_array[$itemname]['size']);
  }
}

Больше нет дубликатов ...

0 голосов
/ 12 августа 2010
//$array is the array in your first example.

foreach($array as $item) {
  $itemname = $item["brand"] . "_" . $item["model"]

  $new_array[$itemname]["brand"]  = $item["brand"];
  $new_array[$itemname]["model"]  = $item["model"];
  $new_array[$itemname]["size"][] = $item["size"];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...