基于共享列值合并和分组来自多个2d数组的行,然后推送另一列';将数据转换为子阵列


Merge and group rows from multiple 2d arrays based on a shared column value then push another column's data into subarrays

场景:

我有这两个阵列

array1:

Array
(
[1] => Array
    (
        [label] => pending
        [fillColor] => #468847
        [data] => 50
    )
[2] => Array
    (
        [label] => dispatched
        [fillColor] => #6ecf70
        [data] => 10
    )
[3] => Array
    (
        [label] => delivered
        [fillColor] => #f89406
        [data] => 1
    )
[4] => Array
    (
        [label] => invoiced
        [fillColor] => #3a87ad
        [data] => 2
    )
)

array2:

Array
(
[1] => Array
    (
        [label] => pending
        [fillColor] => #468847
        [data] => Array
            (
                [0] => 1
            )
    )
)

我需要的结果是

Array
(
[1] => Array
    (
        [label] => pending
        [fillColor] => #468847
        [data] => Array
            (
                [0] => 50
                [1] => 1
            )
    )
[2] => Array
    (
        [label] => dispatched
        [fillColor] => #6ecf70
        [data] => Array
            (
                [0] => 10
                [1] => 0
            )
    )
[3] => Array
    (
        [label] => delivered
        [fillColor] => #f89406
        [data] => Array
            (
                [0] => 1
                [1] => 0
            )
    )
[4] => Array
    (
        [label] => invoiced
        [fillColor] => #3a87ad
        [data] => Array
            (
                [0] => 2
                [1] => 0
            )
    )
)

只有4个标签:

  • pending
  • dispatched
  • delivered
  • invoiced

请注意,数组只是一个示例。可能发生的情况是,第一个数组根本没有值或只有2个值,而第二个数组有3个值或没有值

由于上面的限制,我想使用array_replace并拥有一个名为的数组

base_array = ["pending", "dispatched", "delivered", "invoiced"]

我已经尝试循环base_array,并尝试将array1array2匹配(如果标签存在的话)。

基本上,如果关键字(即标签)不存在于array1array2中的任何一个中,则替换的值将在生成的数组中为0

我试过

foreach($base_array as $key => $value) {
    if(in_array($key, $array1[$key])) {
        $array[$key] = $array1[$key];
    }
}

但看起来我迷失在这些多维数组和替换上了。任何帮助都将不胜感激。谢谢

根据我对你的问题的理解,你可以这样做:-

    $array = array(
    '1' => Array
        (
        'label' => 'pending',
        'fillColor' => '#468847',
        'data' => '50'
    ),
    '2' => Array
        (
        'label' => 'dispatched',
        'fillColor' => '#6ecf70',
        'data' => '10'
    ),
    '3 ' => Array
        (
        'label' => 'delivered',
        'fillColor' => '#f89406',
        'data' => '1'
    ),
    '4' => Array
        (
        'label' => 'invoiced',
        'fillColor' => '#3a87ad',
        'data' => '2'
    ),
);
$array2 = array
    (
    '1' => Array
        (
        'label' => 'pending',
        'fillColor' => '#468847',
        'data' => array
            (
            '0' => '1'
        )
    )
);
$temp = array();
$i = 0;
foreach ($array as $key => $value) {
    $temp[$key]['label'] = $value['label'];
    $temp[$key]['fillColor'] = $value['fillColor'];
    foreach ($array2 as $key2 => $value2) {
        if ($value['fillColor'] == $value2['fillColor'] && $value['label'] == $value2['label']) {
            $temp[$key]['data'][] = $value['data'];
            if (isset($value2['data'][$i])) {
                $temp[$key]['data'][] = $value2['data'][$i];
            }
        } else {
            $temp[$key]['data'][] = $value['data'];
            if (!isset($value2['data'][$i])) {
                $temp[$key]['data'][] = 0;
            }
        }
        $i++;
    }
}
echo '<pre>';
print_r($temp);

试试这个:

$array1 = array(
    array(
        'label'     => 'pending',
        'fillColor' => '#468847',
        'data'      => '50'
    ),
    array(
        'label'     => 'dispatched',
        'fillColor' => '#468847',
        'data'      => '10'
    ),
    array(
        'label'     => 'delivered',
        'fillColor' => '#468847',
        'data'      => '8'
    ),
    array(
        'label'     => 'invoiced',
        'fillColor' => '#468847',
        'data'      => '5'
    )
);
$array2 = array(
    array(
        'label'     => 'pending',
        'fillColor' => '#468847',
        'data'      => array()
    ),
    array(
        'label'     => 'dispatched',
        'fillColor' => '#6ecf70',
        'data'      => array()
    ),
    array(
        'label'     => 'delivered',
        'fillColor' => '#f89406',
        'data'      => array()
    ),
    array(
        'label'     => 'invoiced',
        'fillColor' => '#3a87ad',
        'data'      => array()
    )
);
foreach ($array1 as $order) {
    foreach ($array2 as $key => $group) {
        if ($order['label'] == $group['label']) {
            array_push($array2[$key]['data'], $order['data']);
        }
    }
}
var_dump($array2);

声明具有空data值的默认行数组。

将默认数组、第一个数组和第二个数组合并为一个数组。

迭代合并数组的行。

声明由label值标识的引用数组。在加入其组的子数组之前,将每个遇到的data值显式强制转换为数组。

代码:(演示)

$defaults = [
    ['label' => 'pending', 'fillColor' => '#468847', 'data' => []],
    ['label' => 'dispatched', 'fillColor' => '#6ecf70', 'data' => []],
    ['label' => 'delivered', 'fillColor' => '#f89406', 'data' => []],
    ['label' => 'invoiced', 'fillColor' => '#3a87ad', 'data' => []],
];
$result = [];
foreach (array_merge($defaults, $array1, $array2) as $row) {
    $label = $row['label'];
    $row['data'] = (array) $row['data'];
    if (!isset($ref[$label])) {
        $ref[$label] = $row;
        $result[] = &$ref[$label];
    } else {
        $ref[$label]['data'] = array_merge(
            $ref[$label]['data'],
            $row['data']
        );
    }
}
var_export($result);