PHP根据值组合数组,如果不匹配则加0

时间:2017-06-30 18:12:59

标签: php arrays

我已经看到很多问题讨论了我的部分问题,但却未能将它们纳入解决方案。希望有人可以帮助我。

我有两个数组,我称之为QuantityShipping

以下是Quantity

Array(
    [0] => Array(
            [0] => 1
            [1] => Fed-Ex
        )
    [1] => Array(
            [0] => 2
            [1] => USPS
        )
    [2] => Array(
            [0] => 1
            [1] => USPS-E
        )
)

[0]是数量,[1]是名称。

这是Shipping

Array(
    [0] => Array(
            [0] => 3
            [1] => Fed-Ex
        )
    [1] => Array(
            [0] => 1
            [1] => USPS
        )
    [2] => Array(
            [0] => 11
            [1] => USPS-A
        )
    [3] => Array(
            [0] => 10
            [1] => USPS-E
        )
)

[0]是索引,[1]是名称。

我想基于index 1匹配将它们组合成看起来像这样的东西。如果没有匹配,我希望插入0(就像我的USPS-A示例中一样)。

我称之为Master

Array(
    [0] => Array(
            [0] => 3
            [1] => Fed-Ex
            [2] => 1
        )
    [1] => Array(
            [0] => 1
            [1] => USPS
            [2] => 2
        )
    [2] => Array(
            [0] => 11
            [1] => USPS-A
            [2] => 0
        )
    [3] => Array(
            [0] => 10
            [1] => USPS-E
            [2] => 1
        )
)

[0]是索引,[1]是名称,[2]是数量。

有没有人有任何建议?我尝试使用嵌套的foreach loops,但即使我使用break语句,我最终也会重复。尝试了array_columnin_array,但没有成功。

任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:1)

如果您认为shipping数组总是大于quantity,那么这就是可行的。

$quantities = [
    [1, 'Fex-Ex'],
    [2, 'USPS'],
    [1, 'USPS-E']
];

$shippings = [
    [3, 'Fex-Ex'],
    [1, 'USPS'],
    [11, 'USPS-A'],
    [10, 'USPS-E'],
];

$master = array();
foreach ($shippings as $shipping) {
    $qty = 0;
    foreach ($quantities as $quantity) {
        if ($shipping[1] == $quantity[1]) {
            $qty = $quantity[0];
        }
    }
    $master[] = array(
        $shipping[0],
        $shipping[1],
        $qty
    );
}

var_dump($master);

答案 1 :(得分:1)

您不需要嵌套循环来执行此操作。你可以只遍历每个数组一次。

首先,使用$shipping键(名称)作为索引,迭代$master数组以构建[1]数组。您可以同时在索引2处为数量添加零值。

foreach ($shipping as $s) {
    $master[$s[1]] = $s + [2 => 0];
}

其次,迭代$quantity数组以更新$master中的数量值。

foreach ($quantity as $q) {
    $master[$q[1]][2] = $q[0];
}

请记住,使用这种方法,使用名称作为键,如果有重复的名称,它们将被覆盖。

答案 2 :(得分:0)

我认为这样做(没有嵌套循环):

<?php 

$quantities = [
    [1, 'Fed-Ex'],
    [2, 'USPS'],
    [1, 'USPS-E']
];

$shippings = [
    [3, 'Fed-Ex'],
    [1, 'USPS'],
    [11, 'USPS-A'],
    [10, 'USPS-E'],
];

foreach($quantities as &$v) {
    $quantities[$v[1]] = $v[0];
    unset($v);
}

$master = [];

foreach($shippings as $v) {
    $master[] = [
        $v[0], 
        $v[1], 
        isset($quantities[$v[1]]) ? $quantities[$v[1]] : 0
    ];
}