2010-08-12 100 views
3

如何组这样的:合并和组阵列数据

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 
    )) 

我想组由品牌和型号,但插入的大小的数组,因为这一个不一样。

+1

你能用句子解释你想做什么吗? – 2010-08-12 15:03:06

+0

我想按BRAND和MODEL分组,但在SIZE中插入一个数组,因为这个不一样。 – Derick 2010-08-12 15:12:41

回答

3

在算法方面,你只需要:

  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); 
?> 

另外,为便于访问的我做了它,这样大小的子阵列始终是一个数组。 (即:你没有允许它可能只是一个元素。)

+1

尽管如果品牌/型号已经存在,它可能应该是'if(!in_array($ element ['size'],$ newArray [$ elementKey] ['size']))'只添加新尺寸:p。 – wimvds 2010-08-12 15:24:04

+1

哇!非常感谢你!你救了我的一天!来自日本的欢呼! – Derick 2010-08-12 15:25:20

+1

@Derick - 没问题。欢迎来到stackoverflow。 :-) – 2010-08-12 15:29:26

0
//$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"]; 
} 
+0

这将始终添加大小,即使它是重复的。 – 2010-08-12 15:17:56

+0

也是一个选项!感谢您的帮助! – Derick 2010-08-12 15:28:00

0

“升级”到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']); 
    } 
} 

没有重复了...