Php 将具有相同值的数组分组的最佳方法

Php 将具有相同值的数组分组的最佳方法,php,arrays,Php,Arrays,我需要你的帮助来解决这个问题:) 我有这个数组 Array ( [0] => Array ( [order_id] => 121 [item_id] => 4344 [item_name] => Product [item_price] => 123 [item_type] => product [paypal_address] => email@test.com [qty] => 4 [currency] => EUR )

我需要你的帮助来解决这个问题:)

我有这个数组

    Array ( 
    [0] => Array ( [order_id] => 121 [item_id] => 4344 [item_name] => Product [item_price] => 123 [item_type] => product [paypal_address] => email@test.com [qty] => 4 [currency] => EUR ) 
    [1] => Array ( [order_id] => 121 [item_id] => 3444 [item_name] => Product1 [item_price] => 444 [item_type] => product [paypal_address] => email@test.com [qty] => 2 [currency] => EUR ) 
    [2] => Array ( [order_id] => 121 [item_id] => 1233 [item_name] => Product2 [item_price] => 120 [item_type] => product [paypal_address] => email2@test.com [qty] => 18 [currency] => EUR ) 
)
我想在它上面循环,并将它们按值分组到一个新数组中

例如:

选择阵列中具有相同paypal_地址和价格、和数量的所有项目,并将其移动到新阵列中

这就是我想要实现的目标,有什么提示/建议吗

编辑: 最后,我想要一个这样或类似的数组:

Array ( 
    [0] => Array ( [order_id] => 121 [items_id] => array(4344, 3444) [items_name] => 'Product , Product1' [amt] => 567 [item_type] => product [paypal_address] => email@test.com [qty] => 8 [currency] => EUR )
    [1] => Array ( [order_id] => 121 [items_id] => 1233 [items_name] => Product2 [amt] => 120 [item_type] => product [paypal_address] => email2@test.com [qty] => 18 [currency] => EUR ) 
)
EDIT2: 到目前为止我做了什么。但是它不好用,也不好读

        $groupedParams = array();
        foreach($params as $key=>$param){
            if(!array_key_exists($param['paypal_address'], $groupedParams) && $param['item_type'] == 'product'){
                $groupedParams[$param['paypal_address']] = array(
                    'order_id' => $param['order_id'],
                    'item_id' => $param['item_id'],
                    'item_name' => $param['item_name'],
                    'qty' => $param['qty'],
                    'amt' => $param['item_price'],
                    'item_type' => $param['item_type']
                );
            }else if(array_key_exists($param['paypal_address'], $groupedParams) && $param['item_type'] == 'product'){
                $newItemId = $groupedParams[$param['paypal_address']]['item_id'].','.$param['item_id'];
                $newAmt = (int)$groupedParams[$param['paypal_address']]['amt']+(int)$param['item_price'];
                $newQty = (int)$groupedParams[$param['paypal_address']]['qty']+(int)$param['qty'];
                $newItemName = (string)$groupedParams[$param['paypal_address']]['item_name'].' - '.(int)$param['item_name'];

                $groupedParams[$param['paypal_address']] = array(
                    'order_id' => $param['order_id'],
                    'item_id' => $newItemId,
                    'item_name' => $newItemName,
                    'qty' => $newQty,
                    'amt' => $newAmt,
                    'item_type' => $param['item_type']
                );
            }
}
谢谢

  • 获取数组及其值
  • 在paypal_地址上创建唯一密钥
  • 使用唯一键创建临时数组
  • 在临时数组中使用各自的唯一键存储所有值

        $arr =     Array (
            '0' => Array ( 'order_id' => 121 ,'item_id' => 4344 ,'item_name' => 'Product' ,'item_price' => 123 ,'item_type' => 'product' ,'paypal_address' => 'email@test.com' ,'qty' => 4 ,'currency' => 'EUR' ) ,
            '1' => Array ( 'order_id' => 121 ,'item_id' => 3444 ,'item_name' => 'Product1' ,'item_price' => 444 ,'item_type' => 'product' ,'paypal_address' => 'email@test.com' ,'qty' => 2 ,'currency' => 'EUR' ) ,
            '2' => Array ( 'order_id' => 121 ,'item_id' => 1233 ,'item_name' => 'Product2' ,'item_price' => 120 ,'item_type' => 'product' ,'paypal_address' => 'email2@test.com' ,'qty' => 18 ,'currency' => 'EUR' )
        );
        $tmpArr = Array();
        $cnt = sizeof($arr);
        for($i=0;$i<$cnt;$i++){
                $paypal_address = $arr[$i]['paypal_address'];
                if(!is_array($tmpArr[$paypal_address])){
                        $tmpArr[$paypal_address] = Array();
                }
                $tmpArr[$paypal_address]['paypal_address'] = $arr[$i]['paypal_address'];
                $tmpArr[$paypal_address]['order_id'] = $arr[$i]['order_id'];
                $tmpArr[$paypal_address]['item_name'][] = $arr[$i]['item_name'];
                $tmpArr[$paypal_address]['item_type'][] = $arr[$i]['item_type'];
                $tmpArr[$paypal_address]['currency'][] = $arr[$i]['currency'];
    
    
                $tmpArr[$paypal_address]['qty'] = isset($tmpArr[$paypal_address]['qty']) ? $tmpArr[$paypal_address]['qty'] + $arr[$i]['qty'] : $arr[$i]['qty'];
                $tmpArr[$paypal_address]['item_id'] = $arr[$i]['item_id'];
                $tmpArr[$paypal_address]['item_id'][] = $item_id;
                $tmpArr[$paypal_address]['item_price'] = isset($tmpArr[$paypal_address]['item_price']) ? $tmpArr[$paypal_address]['item_price'] + $arr[$i]['item_price'] : $arr[$i]['item_price'];
    
        }
        print_r($tmpArr);
    

    注意:根据您的需求对代码进行更改

    根据我的理解,您想将其重新组织为更清晰的格式,简单地说:

    $array = array();
    foreach($params as $ar) {
        $array[$ar['paypal_address']][] = $ar;
    }
    

    示例:

    显示所需输出阵列的示例您的原始阵列没有
    amt
    键,而所需阵列有您试图解决的问题?您是从JOIN query获得这个数组的,现在正试图以HTML格式很好地呈现它?看看它,使用类似于:array(['email@test.com']=>数组(数组([订单id]=>121[项目id]=>4344[项目名称]=>产品[项目价格]=>123[项目类型]=>产品[数量]=>4[货币]=>EUR),数组([订单编号]=>121[项目编号]=>3444[项目名称]=>Product1[项目价格]=>444[项目类型]=>product[数量]=>2[货币]=>EUR],['email2@test.com']=>数组(数组([订单id]=>121[商品id]=>1233[商品名称]=>Product2[商品价格]=>120[商品类型]=>product[数量]=>18[货币]=>EUR)));输出结构没有意义。至少要弄清楚你具体需要什么。然后试着自己解决
    $array = array();
    foreach($params as $ar) {
        $array[$ar['paypal_address']][] = $ar;
    }
    
        $details =Array ( 
            [0] => Array ( [order_id] => 121 [item_id] => 4344 [item_name] => Product [item_price] => 123 [item_type] => product [paypal_address] => email@test.com [qty] => 4 [currency] => EUR ) 
            [1] => Array ( [order_id] => 121 [item_id] => 3444 [item_name] => Product1 [item_price] => 444 [item_type] => product [paypal_address] => email@test.com [qty] => 2 [currency] => EUR ) 
            [2] => Array ( [order_id] => 121 [item_id] => 1233 [item_name] => Product2 [item_price] => 120 [item_type] => product [paypal_address] => email2@test.com [qty] => 18 [currency] => EUR ) 
        )
        $sorted = array();
        foreach ($details as $key => $value) {
          $add = $value['paypal_address'];
          foreach ($details as $index => $detail) {
            if ($add == $detail['paypal_address']) {
              foreach ($detail as $cat => $val) {
                if (!in_array($val, $sorted[$key][$cat])) {
                  $sorted[$key][$cat][] = $val;
                }
              }
              unset($details[$index]);
            }
          }
        }
    // Output array
    print_r($sorted);