使用$ key的multiMulti数组进行分组

问题描述 投票:1回答:4

我有一个数组,我想按对象分组,键是一个对象。

$arr = array(
        array('cou_id' => "140", 'number' => "1", 'opera' =>array([0] => array("1", "2") [1] => array("2", "3"))),
        array('cou_id' => "141", 'number' => "1", 'opera' => array([0] => array("1", "2") [1] => array("5", "6"))),
        array('cou_id' => "140", 'number' => "4", 'opera' => array("3", "4")),
        array('cou_id' => "141", 'number' => "2", 'opera' =>array([0] => array("2", "3") [1] => array("6", "7")))   
    );

我想通过'cou_id'将此数组分组,并使用array_merge()(PHP函数)将数字推入array_number,以将Opera合并为array_opera

结果将类似于:

   140 => array('cou_id' => "140", 'number' => "1", 'opera' =>array([0] => array("1", "2") [1] => array("2", "3") [2] => array("3", "4")))
   141 => array('cou_id' => "141", 'number' => "1", 'opera' => array([0] => array("1", "2") [1] => array("5", "6") [2] => array("2", "3") [3] => array("6", "7")))
php arrays group-by
4个回答
1
投票

我认为您正在寻找这个:

$arr = array(
        array('cou_id' => "140", 'number' => "1", 'opera' => array("1", "2")),
        array('cou_id' => "141", 'number' => "1", 'opera' => array("1", "2")),
        array('cou_id' => "140", 'number' => "4", 'opera' => array("3", "4")),
        array('cou_id' => "141", 'number' => "2", 'opera' => array("2", "3"))   
    );

$out = array();
foreach($arr as $val){
    $out[$val['cou_id']]['array_number'][] = $val['number'];
    $out[$val['cou_id']]['array_opera'][] = $val['opera'];
}

echo '<pre>';
print_r($out);

更新:

$arr = array(
        array('cou_id' => "140", 'number' => "1", 'opera' =>array(array("1", "2"), array("2", "3"))),
        array('cou_id' => "141", 'number' => "1", 'opera' => array(array("1", "2"), array("5", "6"))),
        array('cou_id' => "140", 'number' => "4", 'opera' => array("3", "4")),
        array('cou_id' => "141", 'number' => "2", 'opera' =>array(array("2", "3"), array("6", "7")))   
    );

$out = array();
foreach($arr as $val){
    $out[$val['cou_id']]['array_number'][] = $val['number'];
    if(is_array($val['opera'][0])){
        foreach($val['opera'] as $newVal)
            $out[$val['cou_id']]['array_opera'][] = $newVal;
    }
    else
        $out[$val['cou_id']]['array_opera'][] = $val['opera'];
}

echo '<pre>';
print_r($out);

Working Example


1
投票

尝试一下:

$array = array(
    array('cou_id' => "140", 'number' => "1", 'opera' => array("1", "2")),
    array('cou_id' => "141", 'number' => "1", 'opera' => array("1", "2")),
    array('cou_id' => "140", 'number' => "4", 'opera' => array("3", "4")),
    array('cou_id' => "141", 'number' => "2", 'opera' => array("2", "3"))   
);
$final_array = array();
foreach($array as $elem)
{
     if(!array_key_exists($elem['cou_id'],$final_array))
     {
         $final_array[$elem['cou_id']]['array_number'] = array();
         $final_array[$elem['cou_id']]['array_opera'] = array(); 
     }

     $final_array[$elem['cou_id']]['array_number'][] = $elem['number'];
     $final_array[$elem['cou_id']]['array_opera'][] = $elem['opera'];
}

0
投票

您的伪代码似乎正在使用对象,而不是数组作为输入。这意味着一种可能的方法如下。我选择了一个简单的类实现作为示例,因为您没有提供有关该类型的任何信息...

<?php
class something {
    public $cou_id;
    public $number;
    public $opera;
    public function __construct($cou_id, $number, $opera) {
        $this->cou_id = $cou_id;
        $this->number = $number;
        $this->opera = [$opera];
    }
}
$input = [
    0 => new something("140", "1", ["1", "2"]),
    1 => new something("141", "1", ["1", "2"]),
    2 => new something("140", "4", ["3", "4"]),
    4 => new something("141", "2", ["2", "3"]),
];

$output = [];
foreach ($input as $object) {
    $element = &$output[$object->cou_id];
    $element['array_number'][] = $object->number;
    $element['array_opera'][] = $object->opera;
}
print_r($output);

输出显然是:

Array
(
    [140] => Array
        (
            [array_number] => Array
                (
                    [0] => 1
                    [1] => 4
                )

            [array_opera] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [0] => 1
                                    [1] => 2
                                )

                        )

                    [1] => Array
                        (
                            [0] => Array
                                (
                                    [0] => 3
                                    [1] => 4
                                )

                        )

                )

        )

    [141] => Array
        (
            [array_number] => Array
                (
                    [0] => 1
                    [1] => 2
                )

            [array_opera] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [0] => 1
                                    [1] => 2
                                )

                        )

                    [1] => Array
                        (
                            [0] => Array
                                (
                                    [0] => 2
                                    [1] => 3
                                )

                        )

                )

        )

)

0
投票

尝试以下代码:

$firstArray = array(
    array('cou_id' => "140", 'number' => "1", 'opera' =>array(array("1", "2"), array("2", "3"))),
    array('cou_id' => "141", 'number' => "1", 'opera' => array(array("1", "2"), array("5", "6"))),
    array('cou_id' => "140", 'number' => "4", 'opera' => array("3", "4")),
    array('cou_id' => "141", 'number' => "2", 'opera' =>array(array("2", "3"), array("6", "7")))   
);
$result = array();
foreach($firstArray as $e)
{
     if(!array_key_exists($e['cou_id'],$result)) {
         $result[$e['cou_id']]['array_number'] = array();
         $result[$e['cou_id']]['array_opera'] = array(); 
     }

     $result[$e['cou_id']]['array_number'][] = $e['number'];

     if (!is_array($e['opera'][0])) {
         $result[$e['cou_id']]['array_opera'][] = $e['opera'];
     } else {
         $result[$e['cou_id']]['array_opera'] = array_merge($result[$e['cou_id']]['array_opera'], $e['opera']);
     }
}
print_r($result);
© www.soinside.com 2019 - 2024. All rights reserved.