2010-03-09 77 views
2

匹配我的格式为一个数组:寻找子阵列中的PHP

array (
    '1' => array (
     'id' => '2', 
     'qty' => '4' 
    ), 
    '2' => array (
     'id' => '1', 
     'qty' => '1' 
    ), 
    '3' => array (
     'id' => '2', 
     'qty' => '3' 
    ), 
    '4' => array (
     'id' => '4', 
     'qty' => '6' 
    ) 
); 

,并希望找到列“ID”的所有副本,并将它们合并成一个(添加值“数量'一起)。

有没有比这两个foreach更好的方法吗? - 对我来说这似乎有点过于强悍。

+0

你怎么知道你想保留哪些数据? – mcgrailm 2010-03-09 18:29:44

回答

4

不漂亮,但我觉得它做什么,它应该(编辑以保持格式):

$id = array(); 
foreach($array as $v) { 
    if($id[$v['id']]) { 
     $id[$v['id']]['qty'] += $v['qty']; 
    } else { 
     $id[$v['id']] = $v; 
    } 
} 

// Optional reset keys 
// $id = array_values($id); 
// Optional sort keys in ascending order 
// ksort($id); 

print_r($id); 

给出:

Array 
(
    [2] => Array 
     (
      [id] => 2 
      [qty] => 7 
     ) 
    [1] => Array 
     (
      [id] => 1 
      [qty] => 1 
     ) 
    [4] => Array 
     (
      [id] => 4 
      [qty] => 6 
     ) 
) 
+0

不幸的是,数组有更多的元素需要保存 - 否则我会使用它。 :( – Meep3D 2010-03-09 17:46:36

+0

@ Meep3d只是数量改变或者其他元素是否可以改变一个id?例如id = 1,qty = 2,foo = 3,id = 1,qty = 4,foo = 5?如果是,如何处理呢? – Gordon 2010-03-09 17:49:36

+0

@ Meep3d再次更新。应该做你现在正在寻找的东西。 – Gordon 2010-03-09 18:06:33

2

你可以改变这一点,以维持格式,但这基本上是这样做的方式。

$items_by_id = array(); 
foreach($array as $item) 
{ 
    if(!isset($items_by_id[$item['id']])) 
    { 
     $items_by_id[$item['id']] = $item['qty']; 
    } 
    else 
    { 
     $items_by_id[$item['id']] += $item['qty']; 
    } 

}