首页 > 解决方案 > 如何根据PHP中的特定键值将二维数组转换为三维数组?

问题描述

我有一个数组。

$majorEarning = array(
                    array(
                            'user_id' => 1,
                            'booking_id' => 2,
                            'price' => 30
                        ),
                    array(
                            'user_id' => 2,
                            'booking_id' => 1,
                            'price' => 60
                        ),
                    array(
                            'user_id' => 2,
                            'booking_id' => 6,
                            'price' => 10
                        ),
                    array(
                            'user_id' => 1,
                            'booking_id' => 4,
                            'price' => 50
                        )    
    );

我需要像这样重新排序和重组它:-

Array
(
    [0] => Array
        (
            [user_id] => 1
            [booking_data] => Array
                (
                    [0] => Array
                        (
                            [booking] => 2
                            [price] => 30
                        )
                    [1] => Array
                        (
                            [booking] => 4
                            [price] => 50
                        )    

                )

        )

    [1] => Array
        (
            [user_id] => 2
            [booking_data] => Array
                (
                    [0] => Array
                        (
                            [booking] => 1
                            [price] => 60
                        )

                    [1] => Array
                        (
                            [booking] => 6
                            [price] => 10
                        )

                )

        )
)

这是我的编码:-

$formattedEarning = array();
foreach($majorEarning as $keyEarn => $row)
   {
       if(!empty($formattedEarning))
       {
           $return = myfunction($formattedEarning, 'user_id', $row['user_id']);
           if($return)
           {
               $earning = array();
                $earning['booking'] = $row['booking_id'];
                $earning['price']   = $row['price'];
                $formattedEarning[$return]['booking_data'][] = $earning;
           }
           else
           {
               $earning = array();
               $earningChild = array();
                $earning['user_id'] = $row['user_id'];
                $earningChild['booking']         = $row['booking_id'];
                $earningChild['price']    = $row['price'];
                $earning['booking_data'][]  = $earningChild;
                $formattedEarning[] = $earning;
            }
       }
       else
       {
           $earning = array();
               $earningChild = array();
          $earning['user_id'] = $row['user_id'];
                $earningChild['booking']         = $row['booking_id'];
                $earningChild['price']    = $row['price'];
                $earning['booking_data'][]  = $earningChild;
                $formattedEarning[] = $earning;

       }
    }



print_r($formattedEarning);

function myfunction($products, $field, $value)
{
   foreach($products as $key => $product)
   {
      if ( $product[$field] === $value )
         return $key;
   }
   return false;
}

但是数组是这样的:-

Array
(
    [0] => Array
        (
            [user_id] => 1
            [booking_data] => Array
                (
                    [0] => Array
                        (
                            [booking] => 2
                            [price] => 30
                        )

                )

        )

    [1] => Array
        (
            [user_id] => 2
            [booking_data] => Array
                (
                    [0] => Array
                        (
                            [booking] => 1
                            [price] => 60
                        )

                    [1] => Array
                        (
                            [booking] => 6
                            [price] => 10
                        )

                )

        )

    [2] => Array
        (
            [user_id] => 1
            [booking_data] => Array
                (
                    [0] => Array
                        (
                            [booking] => 4
                            [price] => 50
                       )
                )
        )
)

不知道为什么,user_id = 1添加了一个新元素。正如user_id = 1已经存在的那样user_id = 1,预订详细信息应该附加到booking_data先前记录的 中,而不是另一个带有 的新元素。

我究竟做错了什么?

这是在线沙盒链接:- http://sandbox.onlinephpfunctions.com/code/0feb80c20e2b7df30fdf05662cd7aea415b29464

标签: phparrays

解决方案


你可以foreach使用array_key_exists

$r = [];
foreach($majorEarning as $v){
    array_key_exists($v['user_id'], $r)
    ?
    ($r[$v['user_id']]['booking_data'][] = 
    ['booking'=>$v['booking_id'],'price'=>$v['price']])
    :
    ($r[$v['user_id']] = ['user_id' => $v['user_id'], 'booking_data' => [['booking'=>$v['booking_id'], 'price'=>$v['price']]]]);
}

要重新排列键使用array_values($r)

工作演示:https ://3v4l.org/bFKE4


推荐阅读