【问题标题】:php array operations with indexes带索引的php数组操作
【发布时间】:2013-02-05 08:40:12
【问题描述】:

我有一个数组,我用每行的 mysql 查询获取,每个都包含相同的索引,它看起来如下

array(

    0=> array(
         'order_nr'=> 123,
         'order_date' => '2013-01-29 00:00:00',
         'prod_name' => 'prod_1',
         'prod_value' => 1200

       )

    1=> array(
         'order_nr'=> 123,
         'order_date' => '2013-01-29 00:00:00' ,
         'prod_name' => 'prod_2',
         'prod_value' => 2100
    )

)

我想合并主题并对 prod_value 求和并在 prod_name 上创建一个新数组,最后我将拥有单个数组。我将如何在 php 中执行此操作,或者在这种情况下最好的解决方法是什么

array(
 'order_nr'=> 123,
 'order_date'=>'2013-01-29 00:00:00',
 'prod_name'=> array('prod_1', 'prod_2')
 'prod_value' => 3300

)

【问题讨论】:

  • 至少对我来说,理解你想要获得的东西并不容易。请更具体并使用“输出样本”
  • 如果你想总结这些值,我建议在数据库端使用GROUP BY,而不是在 PHP 端
  • 你的 prod_value 是多少??

标签: php arrays sum


【解决方案1】:

如果产品列表不必是数组,您可以使用 Mysql 和聚合函数。应该是这样的:

SELECT order_no, order_data, GROUP_CONCAT(prod_name SEPARATOR ',') as prod_name, 
    SUM(prod_value) as prod_val FROM Products WHERE ... GROUP BY order_no;

如果您需要产品名称作为数组,则可以分解字符串:

explode(',', $row['prod_name']);

【讨论】:

  • 如果我想选择所有列,我该怎么做?
  • 我认为这将是最优雅的捷径
  • 它也会比在代码中循环更有效。我不太明白第一条评论中的问题。你是什​​么意思你想选择所有的列?
【解决方案2】:
$aReturn = array();

foreach( $aData as $entry ) {
 if( empty($aReturn[$entry['order_nr']]) ) {
  $entry['prod_name'] = (array) $entry['prod_name'];
  $aReturn[$entry['order_nr']] = $entry;

  continue;
 }

 $aReturn[$entry['order_nr']]['prod_name'][] = $entry['prod_name'];
 $aReturn[$entry['order_nr']]['prod_value'] += $entry['prod_value'];
}

这将按order_nr分组

【讨论】:

  • 让我试试这个好像很有趣
【解决方案3】:
<?php

$arr = array(0=> array(
                         'order_nr'=> 123,
                         'order_date' => '2013-01-29 00:00:00',
                         'prod_name' => 'prod_1',
                         'prod_value' => 1200

                       ),
            1=> array(
                         'order_nr'=> 123,
                         'order_date' => '2013-01-29 00:00:00' ,
                         'prod_name' => 'prod_2',
                         'prod_value' => 2100
                    )

            );

$sigle_arr = array();   
foreach($arr as $val){
   $sigle_arr[$val['order_nr']]['order_nr']     = $val['order_nr'];
   $sigle_arr[$val['order_nr']]['order_date']   = $val['order_date'];
   $sigle_arr[$val['order_nr']]['prod_name'][]  = $val['prod_name'];
   $sigle_arr[$val['order_nr']]['prod_value']  += $val['prod_value'];

}
print_r($sigle_arr);
?>

【讨论】:

    【解决方案4】:

    使用array_merge_recursive()

    这是最好的选择

    【讨论】:

    • 在这种情况下你不能得到'prod_value',它需要是所有产品'prod_value'的总和
    【解决方案5】:
    $newarray = array();
    foreach($array as $v){
     if(!isset($newarray['order_nr'])){ 
     $newarray['order_nr'] = $v['order_nr'];
     }
     if(!isset($newarray['order_date'])){ 
     $newarray['order_date'] = $v['order_date'];
     }
     $newarray['prod_name'][] = $v['prod_name'];
    
     $newarray['prod_value'] = $newarray['prod_value'] + $v['prod_value'];
    }
    

    【讨论】:

    • 如果数组中有两个订单,我的意思是两个不同的'order_nr'
    • 问题是:相同的索引!
    【解决方案6】:
    $temp = Users::find('all', array('conditions' => array('status' => array('$elemMatch' => array('fields' => array('temp')));
    foreach($whichs as $which)
    {
      foreach($which['temps'] as $temp)
      {
        if($temp['_id'] == $status['temp'])
        {
        array_push($tempsArray,$temp['status']);
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2013-10-05
      • 1970-01-01
      • 2021-12-25
      • 2012-04-01
      • 1970-01-01
      • 2014-01-15
      • 2013-11-04
      • 2017-07-17
      相关资源
      最近更新 更多