订单数组多维

时间:2014-04-22 08:05:43

标签: php arrays

我有一个如下所示的数组:

$cars = array (
  array(
    'a' => 'audi',
    'b' => 'a4'),
  array(
    'a' => 'peugeot',
    'b' => '306'),
  array(
    'a' => 'audi',
    'b' => 'a4'),
  array(
    'a' => 'audi',
    'b' => 'a5'),
  array(
    'a' => 'peugeot',
    'b' => '106'),
  array(
    'a' => 'peugeot',
    'b' => '106'),
);

我需要订购这样的数组(id与名称相同):

name => audi
id=> audi
data => a4 => 2
        a5 => 1
name => peugeot
id=> peugeot
data => 306 => 1
        106 => 2

所以汽车品牌需要按照计算的汽车类型进行分组。

我已经有了这个代码;但这仅适用于小组部分而且计数部分缺失。

function mergeAndOrder($data){

    // set group arrays
    $i = 0; $group1 = array();

    // loop trough array
    $array = array(); $array2 = array();        
    if($data != null){
        foreach($data AS $row){

            // search and order level1
            $search = array_search($row->a,$group1);

            // this object is not found
            if(is_int($search) == false){

                $group1[$i] = $row->a;
                $array[$i]['id'] = $row->a;
                $array[$i]['name'] = $row->a;
                $array[$i]['data'] = array();

                $i++;   

            }               

        }                               
    }

    return $array;
}

有人知道这种情况的解决方案吗?谢谢!

--- INPUT(部分)--- a =这种情况下的租赁公司

Array
(
    [0] => stdClass Object
        (
            [b] => AUDI
            [a] => LPN
        )

    [1] => stdClass Object
        (
            [b] => AUDI
            [a] => LPN
        )

    [2] => stdClass Object
        (
            [b] => AUDI
            [a] => LPN
        )

    [3] => stdClass Object
        (
            [b] => AUDI
            [a] => LPN
        )

--- OUTPUT(部分)---

Array
(
    [0] => Array
        (
            [id] => LPN
            [name] => LPN
            [data] => Array
                (
                )

        )

    [1] => Array
        (
            [id] => ARV
            [name] => ARV
            [data] => Array
                (
                )

        )

    [2] => Array
        (
            [id] => ARVB
            [name] => ARVB
            [data] => Array
                (
                )

        )

    [3] => Array
        (
            [id] => LPD
            [name] => LPD
            [data] => Array
                (
                )

        )

)

Array
(
    [0] => Array
        (
            [id] => LPN
            [name] => LPN
            [data] => Array
                (
                )

        )

    [1] => Array
        (
            [id] => ARV
            [name] => ARV
            [data] => Array
                (
                )

        )

    [2] => Array
        (
            [id] => ARVB
            [name] => ARVB
            [data] => Array
                (
                )

        )

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,这应该做你想要的。

function mergeAndOrder ($data) {

    $output = array();
    foreach ($data as $item) {

        $id    = $item->a;
        $value = $item->b;

        if (!array_key_exists($id, $output)) {
            $output[$id] = array('id' => $id, 'name' => $id, 'data' => array());
        }

        if (!array_key_exists($value, $output[$id]['data'])) {
            $output[$id]['data'][$value] = 0;
        }

        $output[$id]['data'][$value]++;
    }

    // Order by name element
    uasort($output, function ($a, $b) {
        return strcasecmp($a['name'], $b['name']);
    });

    return $output;
}

<强>输出:

Array
(
    [audi] => Array
        (
            [id] => audi
            [name] => audi
            [data] => Array
                (
                    [a4] => 2
                    [a5] => 1
                )

        )

    [peugeot] => Array
        (
            [id] => peugeot
            [name] => peugeot
            [data] => Array
                (
                    [306] => 1
                    [106] => 2
                )

        )
)