Foreach合并为数组

时间:2018-07-23 15:09:56

标签: php arrays multidimensional-array foreach

我在开始时就有这些数组:

Array
(
    [products] => Array
        (
            [0] => 5
            [1] => 4
            [2] => 6
            [3] => 8
            [4] => 4
        )

    [qtys] => Array
        (
            [0] => 20
            [1] => 22
            [2] => 100
            [3] => 0
            [4] => 0
        )

)

我什么时候将这些数组组合在一起才能拥有:

Array
(
    [0] => Array
        (
            [product_id] => 5
            [qty] => 20
        )

    [1] => Array
        (
            [product_id] => 20
            [qty] => 22
        ) ...

但是有了这个foreach:

$products = $post['products'];
            $qtys = $post['qtys'];

            $array = [];


            foreach($products as $product){
                foreach($qtys as $quantity){

                    if(!in_array($product, $array)){
                    $array[] = array(
                            'product_id' => $product,
                            'qty' => $quantity
                        );
                    }
                }
            }

            echo "<pre>".print_r($array, true)."</pre>";

我得到这个结果:

Array
(
    [0] => Array
        (
            [product_id] => 5
            [qty] => 20
        )

    [1] => Array
        (
            [product_id] => 5
            [qty] => 22
        )

我尝试了很多,例如休息,继续。 我什至尝试了array_combine,结果不是我所期望的。 我曾考虑过使用array_unique,但不适用于多维数组(这是我的理解)。

3 个答案:

答案 0 :(得分:1)

您可以保留原始的$post数组,并使用以下键使用一个简单的foreach

foreach($post['products'] as $key => $value){
    $array[] = array('product_id' => $value,
                     'qty' => $post['qtys'][$key]
               );
}

如果您想避免出现!in_array出现的重复商品,只需在product_id处键入结果即可:

foreach($post['products'] as $key => $value){
    $array[$value] = array('product_id' => $value,
                           'qty' => $post['qtys'][$key]
                     );
}

如果需要,您可以使用$array = array_values($array);重新编制索引。

答案 1 :(得分:0)

由于您的密钥是数字的,并且从0开始连续:

// $post is your array with all the data
$newArray = [];
for ($i=0; $i < count($post['products']); $i++) { 
    $newArray[] = [
        'product_id' => $post['products'][$i];
        'qty' => $post['qtys'][$i];
    ];
}

我还假设“ products”和“ qtys”数组的长度相同。

答案 2 :(得分:0)

问题是您正在使用两个嵌套循环,因此第一个array中的所有项目都将与第二个数组中的所有项目配对。相反,您将需要按索引循环并添加项目。

function mergeProductQuantities($products, $quantities) {
    //Creating an empty output array
    $output = array();
    //Getting the number of iterations
    $limit = ($pc = count($products)) > ($qc = count($quantities)) ? $pc : $qc;
    //Doing the actual iteration
    for ($index = 0; $index < $limit; $index++) {
        //Creating a new item
        $newItem = array();
        //Setting applicable values
        if (isset($products[$index])) $newItem["product_id"] = $products[$index];
        if (isset($quantities[$index])) $newItem["qty"] = $quantities[$index];
        //Adding the new item to the output
        $output[]=$newItem;
    }
    return $output;
}

并这样称呼它:

$result = mergeProductQuantities($post['products'], $post['qtys']);