Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数组按键合并为多维数组_Php_Arrays_Multidimensional Array - Fatal编程技术网

Php 数组按键合并为多维数组

Php 数组按键合并为多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我无法解决将数组合并到多维数组的问题 我的数组看起来像: Array ( [0] => Array ( [id] => 41844 [regNumber] => CSM-057.05 [name] => 100n SMD 0603 10% X7R 25V [madeBy2] => Pro_Sinoskysun International (HK)

我无法解决将数组合并到多维数组的问题

我的数组看起来像:

Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_Sinoskysun International (HK) CO., LTD
        )

    [1] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_RUTRONIK Elektronische Ba
        )

    [2] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TTI
        )

    [3] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_ARROW CENTRAL EUROPE GMBH
        )

    [4] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )

    [5] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_YANGZHIDING ELECTRONICS
        )
     [6] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => 
        )
     [7] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )
)
我需要像这样合并它们:

Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Array
            (
                "Pro_Sinoskysun International (HK) CO., LTD",
                "Pro_RUTRONIK Elektronische Ba",
                "Pro_TTI",
                "Pro_ARROW CENTRAL EUROPE GMBH",
                "Pro_TDK",
                "Pro_YANGZHIDING ELECTRONICS"
            )
       )
     [1] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => 
        )
     [2] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )
)
输入数组可以是5个或500个项目,我需要按ID合并它们。。只有一件事彼此不同,那就是谁制造了它们。这有可能吗

如果还需要什么,我可以加上


非常感谢您的帮助。

无论数组是否具有不同的id值,此代码都将生成所需的输出。此代码假定所有类似产品按顺序分组,但:

$output = array();
$i = -1;
foreach ($array as $arr) {
    if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
        // new product
        $output[++$i] = $arr;
        $output[$i]['madeBy2'] = array($arr['madeBy2']);
    }
    else {
        // same product, new manufacturer
        $output[$i]['madeBy2'][] = $arr['madeBy2'];
    }
}
print_r($output);
示例数据的输出

Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Array
            (
                "Pro_Sinoskysun International (HK) CO., LTD",
                "Pro_RUTRONIK Elektronische Ba",
                "Pro_TTI",
                "Pro_ARROW CENTRAL EUROPE GMBH",
                "Pro_TDK",
                "Pro_YANGZHIDING ELECTRONICS"
            )
       )
     [1] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => 
        )
     [2] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )
)

我构建了一个数组,该数组由数据中的id值索引,如果尚未设置,那么我将使用数据创建一个新元素——尽管madeBy2是作为数组创建的。如果元素已经存在,则使用[]将新值添加到现有值列表中

这将保留一个由id索引的数组,因此我在打印中使用数组值,如果需要,您可以保留它。

代码中的注释

foreach ($array as $arr) {
    if(!isset($output[$arr["id"]])){ // if item does not exist
        $output[$arr["id"]] = $arr; // create array
        $output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
    }else{    
        $output[$arr["id"]]['madeBy2'][] = $arr['madeBy2']; // it item exist add madeBy2 to the list
    }
}
$output = array_values($output); // remove associative array keys.
print_r($output);
此方法不依赖于正在排序的列表,只有madeBy2是硬代码。 这意味着如果一个数组有一个额外的项,这个方法将使它与Nigel的相反。 输出:

带额外项目的演示:

到目前为止,你尝试过什么吗?我会说这是可以做到的,甚至不会那么难。在迭代过程中,您必须迭代第一个数组,并将元素添加到第二个数组中它们各自的位置first@NigelRen是的,我。。此外,我还尝试在堆栈上查找答案,但没有任何结果符合我的要求..:4.我是自学成才,所以自己解决问题会比较困难。。我试了几个小时,但没有结果。。输出不是您编写的,但我可以使用它..:非常感谢你的帮助。输出@Danielsympoweiss你是对的。。。粘贴3v4l的输出是一件痛苦的事,所以我复制了您的输出-P但是我添加了一个替代解决方案,它只会在有多个值的情况下将madeBy2转换为数组,所以它会给你那个输出。还有一个问题。。如果我想在数组madeBy2的行中添加描述,我该怎么做?@DanielSymphoWeiss我看不出描述来自何处?如果您以此答案为起点提出一个新问题并添加其他信息,可能会更好。从好的方面来说,你可以通过接受另一个答案获得额外的声誉!啊,好吧,我不想再问了,给我点时间
$out = [];
foreach ( $inp as $data )   {
    if ( isset ($out[$data['id']])) {
        $out[$data['id']]["madeBy2"][] = $data["madeBy2"];
    }
    else {
        $out[$data['id']] = [ "id"=>$data['id'],
            "regNumber" => $data['regNumber'],
            "name" => $data['name'],
            "madeBy2" => [$data['madeBy2']]];
    }
}
print_r(array_values($out));
foreach ($array as $arr) {
    if(!isset($output[$arr["id"]])){ // if item does not exist
        $output[$arr["id"]] = $arr; // create array
        $output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
    }else{    
        $output[$arr["id"]]['madeBy2'][] = $arr['madeBy2']; // it item exist add madeBy2 to the list
    }
}
$output = array_values($output); // remove associative array keys.
print_r($output);
Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100nSMD060310%X7R25V
            [madeBy2] => Array
                (
                    [0] => Pro_SinoskysunInternational(HK) CO.,LTD
                    [1] => Pro_RUTRONIKElektronischeBa
                    [2] => Pro_TTI
                    [3] => Pro_ARROWCENTRALEUROPEGMBH
                    [4] => Pro_TDK
                    [5] => Pro_YANGZHIDINGELECTRONICS
                )

        )

    [1] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => Array
                (
                    [0] => 
                )

        )

    [2] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Array
                (
                    [0] => Pro_TDK
                )

        )

)