【问题标题】:Merge 2 arrays with null values合并 2 个空值数组
【发布时间】:2021-01-15 16:45:32
【问题描述】:

我要合并2个表我给你举个例子:

foreach ($dashboardData as $item) {
    $results[$item['month']] = [
        DashboardConsts::COLUMN_MONTHLY => $item['month'] ?? null,
        DashboardConsts::ROW_NBR => $item['nbr'] ?? null,
        DashboardConsts::ROW_SELL_PRICE => $item['sum'] ?? null,
        'number' => $item['countNewBc'] ?? null,
    ];
}

array:2 [▼
  "2020-12" => array:4 [▼
    "Mois" => "2020-12"
    "Nbr vendus" => null
    "CA TTC" => null
    "number" => "1"
  ]
  "2021-01" => array:4 [▼
    "Mois" => "2021-01"
    "Nbr vendus" => null
    "CA TTC" => null
    "number" => "2"
  ]
]

"2020-12" => array:4 [▼
  "Mois" => "2020-12"
  "Nbr vendus" => "1"
  "CA TTC" => "790"
  "number" => null
]
"2021-01" => array:4 [▼
  "Mois" => "2021-01"
  "Nbr vendus" => "3"
  "CA TTC" => "1680"
  "number" => null
]

基本上在这里,我按句点对我的值进行分组,我尝试合并我的 2 个数组以确保为“空”的字段。

我想将空值替换为填充在其中一个数组中的值。

我不得不尝试做这样的事情:

$tableau1  = array_filter($tableau1);
$tableau2  = array_filter($tableau2);
$result = array_merge($tableau1, $tableau2);

但它不起作用。

编辑:

我希望我的最终结果是这样的

array:2 [▼
  "2020-12" => array:4 [▼
    "Mois" => "2020-12"
    "Nbr vendus" => "1"
    "CA TTC" => "790"
    "number" => "1"
  ]
  "2021-01" => array:4 [▼
    "Mois" => "2021-01"
    "Nbr vendus" => "3"
    "CA TTC" => "1680"
    "number" => "2"
  ]
]

【问题讨论】:

  • 你能举例说明你希望完成的数组是什么样子吗?或者标注哪一个是输入数组,哪一个是最终数组。
  • 我刚刚编辑了我的请求,我真的不知道哪个是最终数组,两者都可以是我认为的最终数组
  • 好的,很好。如果两个值都不为空会发生什么?哪个数组应该将值带入决赛?或者,它们永远不会重叠?无论哪种方式,我都会在下面发布答案。另外,如果两个数组都为空怎么办?
  • 哦,好吧,我明白了,数组 2 是最终数组,第一个数组可以有 emply 值(比如键“数字”可以没有值),但第二个数组总是有值(比如“CA TTC", Nbr vendus")

标签: php arrays multidimensional-array


【解决方案1】:

有很多方法可以实现这一点,所有的解决方案,都需要通过数组,一种或另一种。

您可以轻松完成foreach () 循环马拉松和大量if () 语句,以确保正确进行转换。

无论如何,这是我对这个问题的看法。

删除null 值并将其替换为array_replace_recursive()

<?php

function array_remove_null($input) { 
  foreach ($input as &$value) { 
    if (is_array($value)) { 
      $value = array_remove_null($value); 
    }
  }
  return array_filter($input, function($item){
    return $item !== null && $item !== '';
  }); 
}

/**
 * Using https://www.php.net/manual/en/function.array-replace-recursive.php
 */

$array1 = [
    "2020-12" => [
        "Mois" => "2020-12",
        "Nbr vendus" => null,
        "CA TTC" => null,
        "number" => "1",
    ],
    "2021-01" => [
        "Mois" => "2021-01",
        "Nbr vendus" => null,
        "CA TTC" => null,
        "number" => "2",
    ],
];

$array2 = [
    "2020-12" => [
        "Mois" => "2020-12",
        "Nbr vendus" => "1",
        "CA TTC" => "790",
        "number" => null,
    ],
    "2021-01" => [
        "Mois" => "2021-01",
        "Nbr vendus" => "3",
        "CA TTC" => "1680",
        "number" => null,
    ],
];

$array = array_replace_recursive(array_remove_null($array1), array_remove_null($array2));

var_dump($array);

实际操作中:https://3v4l.org/WJnYu

【讨论】:

  • 非常感谢,它工作得很好,如果我可以添加另一个数组,添加新密钥等,这样会更简单......
【解决方案2】:

我想我明白了。您需要一个嵌套循环来访问两组数据。以下可能不是实际答案,但很接近。

$results = array();
foreach ($inputArrayOne as $onekey => $arrayOne) {
    $temp_results = array();
    foreach ($inputArrayTwo as $twokey => $arrayTwo) {
        if ($onekey != $twokey) {
            continue;
        }
        if (!is_null($arrayOne['month'])) {
            $temp_results['Mois'] = $arrayOne['month'];
        } else if (!is_null($arrayTwo['month'])) {
            $temp_results['Mois'] = $arrayTwo['month'];
        } else {
            $temp_results['Mois'] = null;   // to account for bad data
        }
        if (!is_null($arrayOne['nbr'])) {
            $temp_results['Nbr vendus'] = $arrayOne['nbr'];
        } else if (!is_null($arrayTwo['nbr'])) {
            $temp_results['Nbr vendus'] = $arrayTwo['nbr'];
        } else {
            $temp_results['Nbr vendus'] = null; // to account for bad data
        }
        if (!is_null($arrayOne['sum'])) {
            $temp_results['CA TTC'] = $arrayOne['sum'];
        } else if (!is_null($arrayTwo['sum'])) {
            $temp_results['CA TTC'] = $arrayTwo['sum'];
        } else {
            $temp_results['CA TTC'] = null; // to account for bad data
        }
        if (!is_null($arrayOne['countNewBc'])) {
            $temp_results['number'] = $arrayOne['countNewBc'];
        } else if (!is_null($arrayTwo['countNewBc'])) {
            $temp_results['number'] = $arrayTwo['countNewBc'];
        } else {
            $temp_results['number'] = null; // to account for bad data
        }
    }
    $results[$arrayOne['month']] = $temp_results;
}

【讨论】:

  • 可能需要在嵌套循环中进行比较以检查您是否在正确的索引上。我会尽快补充。另外,我可能会通过一组索引来关闭值。
  • 仅供参考 - 我从不在 php 中使用类,所以你必须自己弄清楚这部分。
  • 非常感谢您的帮助,我选择了其他答案,因为它更易于使用,但您的也很好
  • 不客气。我知道,当我看到另一个答案时,我也喜欢它更短的方式。
【解决方案3】:

我知道你得到了答案,但如果有人偶然发现这个问题并且不需要递归(数组中只有一层)检查,那么你可以这样做: (我的逻辑只是用零替换 null 并将数组中的等效键相加。在我的代码中,我还理所当然地认为每个数组的内部数组中都有相同的相同键)

$new_arr = array_slice($array1,0);
foreach($array1 as $headkey=>$item) {
    foreach($item as $innerkey=>$it) {
        $null_change = false;
        if ($array1[$headkey][$innerkey] === null) {
            $array1[$headkey][$innerkey] == 0;
            $null_change = true;
        }
        if ($array2[$headkey][$innerkey] === null) {
            $array2[$headkey][$innerkey] == 0;
            $null_change = true;
        }
        
        if ($null_change === true) {
            $new_arr[$headkey][$innerkey] = $array1[$headkey][$innerkey] + 
            $array2[$headkey][$innerkey];
        } 
    }
}
var_dump($new_arr);

如果您需要基于未知数量的数组的更通用的结果,您可以这样做(但每个数组中仍然只有一个级别):

function replaceNullOccurences(...$arrays) {
    if (!is_array($arrays[0])) return;
    $new_arr = array_slice($arrays[0],0);
    foreach($arrays[0] as $headkey=>$item) {
        foreach($item as $innerkey=>$it) {
            $null_change = false;
            foreach($arrays as $arr) {
                if ($arr[$headkey][$innerkey] === null) {
                    $arr[$headkey][$innerkey] == 0; //Change null to zero for addition below
                    $null_change = true;
                }
            }
            //If null in the key in any array, sum together the arrays
            if ($null_change === true) {
                foreach($arrays as $arr) {            
                    $new_arr[$headkey][$innerkey] += $arr[$headkey][$innerkey];
                }
            }
        }
    }
    return $new_arr;        
}

$result = replaceNullOccurences($array1, $array2);

【讨论】:

  • 非常感谢,你的回答也很好,两个代码我都喜欢
  • @Imrickjames - 没问题。也许我也帮助别人。无论如何,这就是我的意图:-)
猜你喜欢
  • 2019-06-02
  • 2019-09-04
  • 2012-05-31
  • 2020-09-15
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多