使用唯一键从另一个数组生成一个数组

时间:2018-01-26 15:49:54

标签: php arrays multidimensional-array

我有一个包含3个产品的数组,其属性为" color"和"尺寸"并且产品由数字标识(['代码'])。 我的问题是,当我从数据库中提取数据时,我得到的这个数组是6件,因为" color"和"尺寸"存储在单独的数组中。

我的问题是,如何将数据生成到这3个产品的数组中,并将所有数据放在同一个数组中。

Array(

   [0] => Array
       (
        [code] => 123
        [name] => box
        [stock] => 2.00
        [price] => 10.00
        [color] => brown
    )

[1] => Array
    (
        [code] => 123
        [name] => box
        [stock] => 2.00
        [price] => 10.00
        [size] => L
    )

[2] => Array
    (
        [code] => 1234
        [name] => box
        [stock] => 3.00
        [price] => 11.00
        [color] => brown
    )

[3] => Array
    (
        [code] => 1234
        [name] => box
        [stock] => 3.00
        [price] => 11.00
        [size] => XL
    )

[4] => Array
    (
        [code] => 12345
        [name] => box
        [stock] => 4.00
        [price] => 12.00
        [size] => XL
    )

[5] => Array
    (
        [code] => 12345
        [name] => box
        [stock] => 4.00
        [price] => 12.00
        [color] => gray
    )

预期产出:

[0] => Array
    (
    [code] => 123
    [name] => box
    [stock] => 4.00
    [price] => 12.00
    [color] => gray
    [size] => XL
)

我要做的就是将doubled数组合成一个。不要再乱用SQL了 - 它在一个表中获取属性名称,从另一个表中获取属性值,从另一个表中获取代码,股票,价格,从另一个表中获取名称。我知道只有这个阵列可以做一些事情,即使它只是一个临时的解决方案。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

假设您的数组是$ products

$merged = array();

foreach($products as $product) {
    if (!isset($sorted[$product['code']])) {
        $merged[$product['code']] = $product;
    } else {
        $merged[$product['code']] = array_merge($sorted[$product['code']], $product);
    }
}

将产品代码用作数组键,然后合并数组。

答案 1 :(得分:1)

如果这两行始终是直接后继者,第一行持有color字段,而后者则占据size字段,您可以轻松地通过在for循环中迭代它们:

$maxCount = count($array);
for ($i = 1; $i < $maxCount; $i += 2) {
    $array[$i - 1]['size'] = $array[$i]['size'];
    unset($array[i]);
}

这将迭代数组的每个第二个元素,并将size字段添加到前一个字段。

如果您之后需要有成功的数组键,可以拨打$arry = array_values($array);

如果关联的行可能不是后继者,则需要根据其code字段(如果是主键)映射它们。您可以使用array_reduce()

$desiredOutput = array_reduce($array, function($output, $element) {
    if (!array_key_exists($element['code'], $output)) {
        $output[$element['code']] = $element;
    } elseif (array_key_exists('size', $element)) {
        $output[$element['code']]['size'] = $element['size'];
    } elseif (array_key_exists('color', $element)) {
        $output[$element['code']]['color'] = $element['color'];
    }
    return $output;
}, []);