【问题标题】:How to convert two dimensional array to three dimensional array based on specific key value in PHP? [duplicate]如何根据PHP中的特定键值将二维数组转换为三维数组? [复制]
【发布时间】:2019-09-12 08:47:51
【问题描述】:

我有一个数组。

$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

【问题讨论】:

  • 您需要使用临时(用户 ID)密钥,然后再重新索引。如果我没有家人,我会回答。输入是否来自 mysql 结果集?为什么您实际上需要新结构?
  • 可能您应该使用 user_id 作为单个数组的数组键(而不是 0、1、2、...),这样您就可以简单地对预订和价格进行排序。可能会检查键是否存在,如果不存在,则使用 user_id 键创建一个新数组。
  • 如果这是一个mysql结果集,你在用pdo吗?
  • 您的项目 ny 分组有什么好处?你下一步怎么做?这些数据是如何使用的?

标签: php arrays


【解决方案1】:

您可以将foreacharray_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

【讨论】:

  • 您的数组没有第 0 个索引。您正在根据 user_id 设置索引。我不需要那个。
  • 使用array_values($r)重新排列数组键,检查这个3v4l.org/cGgo1
【解决方案2】:

你会像这样迭代你的数组,检查Demo

$result = [];
foreach($majorEarning as $array){
    $user_id = $array["user_id"];
    $result[$user_id]["user_id"] = $user_id;
    $result[$user_id]["booking_data"][] = array(
        "booking" => $array["booking_id"],
        "price" => $array["price"]
    );
}
$result = array_values($result);

【讨论】:

    【解决方案3】:

    这将是我的方法:

    <?php
    $input = [
        [
            'user_id' => 1,
            'booking_id' => 2,
            'price' => 30
        ],
        [
            'user_id' => 2,
            'booking_id' => 1,
            'price' => 60
        ],
        [
            'user_id' => 2,
            'booking_id' => 6,
            'price' => 10
        ],
        [
            'user_id' => 1,
            'booking_id' => 4,
            'price' => 50
        ]
    ];
    $output = [];
    array_walk($input, function($entry) use (&$output) {
        $output[$entry['user_id']]['user_id'] = $entry['user_id'];
        $output[$entry['user_id']]['booking_data'][] = [
            'booking' => $entry['booking_id'],
            'price' => $entry['price']
        ];
    });
    var_dump(array_values($output));
    

    输出显然是:

    array(2) {
      [0]=>
      array(2) {
        ["user_id"]=>
        int(1)
        ["booking_data"]=>
        array(2) {
          [0]=>
          array(2) {
            ["booking"]=>
            int(2)
            ["price"]=>
            int(30)
          }
          [1]=>
          array(2) {
            ["booking"]=>
            int(4)
            ["price"]=>
            int(50)
          }
        }
      }
      [1]=>
      array(2) {
        ["user_id"]=>
        int(2)
        ["booking_data"]=>
        array(2) {
          [0]=>
          array(2) {
            ["booking"]=>
            int(1)
            ["price"]=>
            int(60)
          }
          [1]=>
          array(2) {
            ["booking"]=>
            int(6)
            ["price"]=>
            int(10)
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2019-07-09
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多