【问题标题】:How to combine inner array values in one multidimensional array?如何在一个多维数组中组合内部数组值?
【发布时间】:2015-10-30 11:51:00
【问题描述】:

您好,我有一个多维数组,我使用 mysql PDO 检索数据并以这种方式格式化

array('id'=>$row['empname'],'data'=>array(array($row['salestat'],$row['salecount'])))

Array
(
[0] => Array
    (           
        [id] => 'employee1'
        [data] => Array
             (
              0 => 'Sold'
              1 => 1
             )
    )

[1] => Array
    (            
        [id] => 'employee2'
        [data] => Array
             (
              0 => 'On Process'
              1 => 4
             )
    )

[2] => Array
    (            
        [id] => 'employee2'
        [data] => Array
             (
              0 => 'Sold'
              1 => 2
             )
    )
)

我正在尝试制作这样的输出,尝试对其进行格式化,以便我可以将其用于 highcharts 中的 drilldown 系列,谢谢

Array
(
[0] => Array
    (           
        [id] => 'employee1'
        [data] => Array
             (
              0 => 'Sold'
              1 => 1
             )
    )

[1] => Array
    (            
        [id] => 'employee2'
        [data] => Array
           [0]
             (
              0 => 'On Process'
              1 => 4
             )
           [1]
             (
              0 => 'Sold'
              1 => 2
             )
    )
)

【问题讨论】:

  • 使用循环怎么样?而且您不能在同一级别拥有相同的索引。
  • 请先了解数组,您不能多次提供相同的密钥
  • 不能在数组中给出相同的键
  • 数组不能有相同的键,如果有,那么它将获得该数组的最后一个值how-does-php-index-associative-arrays
  • 编辑是否更合适?我为内部数组指定键的唯一原因是因为我认为这些键可用于识别以将它们组合成一个

标签: php arrays multidimensional-array pdo highcharts


【解决方案1】:

首先,您不能使用相同的键(如salescountsalestat)两次使用数组中的字段。但是你可以这样做。

function wrapSameId( $employeeArray ) {

    //create the new array.
    $newEmployeeArray = array();

    //loop the old array.
    foreach ($employeeArray as $key => $value) {
        $exists = 0;
        $i=0;

        $id = $value['id'];
        $data = $value['data'];

        //see if you can find the current id inside the newly created array if you do, only push the new data in.
        foreach ($newEmployeeArray as $key2 => $value2) {
            if( $id == $value2['id'] ) { $newEmployeeArray[$key2]['data'][] = $data;$exists = 1;var_dump($value2['data']); }
            $i++;
        }

        //if we didnt find the id inside the newly created array, we push the id and the new data inside it now.
        if( $exists == 0 ){
            $newEmployeeArray[$i]['id'] = $id;
            $newEmployeeArray[$i]['data'][] = $data; 
        }
    }   

    return $newEmployeeArray;

}

这个函数应该返回一个新数组,但是如果在旧数组中有多个具有相同 id 的数组,我们应该在这个数组中:

Array
(
    [0] => Array
        (
            [id] => employee1
            [data] => Array
                (
                    [0] => Array
                        (
                            [salescount] => 4
                            [salesstat] => Sold
                        )

                )

        )

    [1] => Array
        (
            [id] => employee2
            [data] => Array
                (
                    [0] => Array
                        (
                            [salescount] => 2
                            [salesstat] => In Progress
                        )

                    [1] => Array
                        (
                            [salescount] => 5
                            [salesstat] => Sold
                        )

                )

        )

)

你可以这样使用它:

$employees = wrapSameId( $PDOArray );

$PDOArray 是您的初始数组。希望这就是您想要的。

【讨论】:

  • 谢谢先生,我编辑了我的帖子,因为它造成的混乱不仅仅是帮助,但我尝试了你的代码,它就像一个魅力我的 highcharts 钻取工作现在非常感谢你的回答和帮助:)跨度>
  • @ClintLo 很高兴我能帮上忙,继续编码。
【解决方案2】:

为什么不按id索引你的输出数组?

遍历您的初始数组并将 salecountsalestat 对添加到员工的数据数组中。

$outputArray = array();

//Loop over each entry pulled from you database...
foreach ($employeeArray as $employeeInfo)
{
    //If no index for the current employee exists, create an empty array
    //The only reason I'm including this is because I'm not sure how array_merge handles nulls -- just to be safe
    if (!$outputArray[$employeeInfo['id']])
    {
        $outputArray[$employeeInfo['id']] = array();
    }

    //Merge the existing array for that employee with the new data for the same employee
    $outputArray[$employeeInfo['id']] = array_merge($outputArray[$employeeInfo['id']], $employeeInfo['data']);
}

print_r($outputArray);

更容易可视化输出...

Array
(
[employee1] => Array
            (           
                 0 => 1
                 1 => 'Sold'
            )

[employee2] => Array
            (            
                 0 => 4
                 1 => 'On Process'
                 2 => 2
                 3 => 'Sold'
            )
)

如果您对按 id 索引的输出不满意,请再次循环并根据需要设置格式。

$otherOutputArray = array();
foreach ($outputArray as $key => $value)
{
    $otherOutputArray[] = array('id' => $key, 'data' => $value);
}

这正是你想要的。

【讨论】:

  • 先生,感谢您提供一种输出我之前发布的内容的方法,它按预期工作我真诚地道歉,因为我编辑我的帖子晚了。但希望我能在不久的将来使用你今天教给我的东西。感谢您的时间和精力:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2015-12-27
  • 2021-04-26
  • 2011-07-09
  • 1970-01-01
  • 2015-10-30
相关资源
最近更新 更多