Php 合并2个具有空值的数组
我想合并两个表,我向您展示了一个示例:Php 合并2个具有空值的数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我想合并两个表,我向您展示了一个示例: foreach ($dashboardData as $item) { $results[$item['month']] = [ DashboardConsts::COLUMN_MONTHLY => $item['month'] ?? null, DashboardConsts::ROW_NBR => $item['nbr'] ?? null, DashboardConsts::ROW_S
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"
]
]
及
基本上在这里,我把我的价值观分成了一组通过句点,我尝试合并我的2个数组,以确保“null”字段
我想替换空值其中一个数组中填充的
我必须试着做这样的事情:
$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"
]
]
我想我明白了。您需要一个嵌套循环来访问这两组数据。下面可能不是实际的答案,但很接近
$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;
}
我想我明白了。您需要一个嵌套循环来访问这两组数据。下面可能不是实际的答案,但很接近
$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;
}
实现这一点的方法有很多,所有的解决方案都需要以这样或那样的方式通过阵列 您可以轻松地执行
foreach()
循环,并加载if()
语句,以确保正确进行转换
无论如何,这是我对这个问题的看法
删除null
值并将其替换为:
实现这一点的方法有很多,所有的解决方案都需要通过阵列,以这种或那种方式
您可以轻松地执行foreach()
循环,并加载if()
语句,以确保正确进行转换
无论如何,这是我对这个问题的看法
删除null
值并将其替换为:
我知道您已经得到了答案,但是如果有人偶然发现了这个问题,并且不需要递归(数组中只有一级)检查,那么您可以这样做:
(我的逻辑只是将null替换为零,并将数组中的等效键相加。在我的代码中,我还想当然地认为每个数组的内部数组中都有相同的键)
如果需要基于未知数组数的更通用的结果,可以这样做(但每个数组中仍然只有一个级别):
我知道您已经得到了答案,但如果有人偶然发现了这个问题,并且不需要递归(数组中只有一级)检查,那么您可以这样做:
(我的逻辑只是将null替换为零,并将数组中的等效键相加。在我的代码中,我还想当然地认为每个数组的内部数组中都有相同的键)
如果需要基于未知数组数的更通用的结果,可以这样做(但每个数组中仍然只有一个级别):
你能举一个例子来说明你想要完成的数组是什么样子的吗?或者标记哪一个是输入数组,哪一个是最终数组。我只是编辑了我的请求,我不知道哪一个是最终数组,两者都可以是最终数组,我觉得很好。如果两个值都不是null,会发生什么?哪一个数组应该将值放入最终值?或者,它们从不重叠吗?不管怎样,我都会在下面贴一个答案。另外,如果两个数组都为空会发生什么?哦,好的,我理解,数组2是最终的,第一个可以有emply值(比如键“number”可以没有值),但是第二个数组总是有值(比如“CA TTC”,Nbr vendus)你能举一个例子来说明你想要完成的数组是什么样子的吗?或者标注哪一个是输入数组,哪一个是最终数组。我刚刚编辑了我的请求,我真的不知道哪一个是最终数组,两者都可以是我认为的最终数组。很好。如果两个值都不为null,会发生什么情况?哪个数组应该接受值n到最后一个?或者,它们永远不会重叠吗?不管怎样,我都会在下面发布一个答案。另外,如果两个数组都为空会发生什么?哦,好吧,我明白了,数组2是最后一个,第一个可以有emply值(比如键“number”可以没有值),但第二个数组总是有值(比如“CA TTC”,Nbr vendus)可能需要在嵌套循环中进行比较,以检查索引是否正确。我很快会补充这一点。另外,我可能对一组index的值不感兴趣。仅供参考-我从不在php中使用类,因此您必须自己解决这一部分。非常感谢您的帮助,我选择了另一个答案,因为它更易于使用,但您的答案很好。欢迎使用。我明白,当我看到另一个答案时,我也喜欢它的简短。可能需要在嵌套循环中进行比较,以检查您是否在正确的索引上。我很快会补充这一点。另外,我可能对一组index的值不感兴趣。仅供参考-我从不在php中使用类,因此您必须自己解决这一部分。非常感谢您的帮助,我选择了另一个答案,因为它更易于使用,但您的答案很好。欢迎使用。我明白,当我看到另一个答案时,我也喜欢它的简短。非常感谢,它工作得非常完美,通过这种方式,如果我可以添加另一个数组,添加新的键等,它会更简单。非常感谢,它工作得非常完美,通过这种方式,如果我可以添加另一个数组,添加新的键等,它会更简单。非常感谢,你的回答也很好,我两个都喜欢codes@Imrickjames-没问题。也许我也能帮助别人。这就是我的意图:-)非常感谢你,你的回答也很好,我两个都喜欢codes@Imrickjames-没问题。也许我也能帮助别人。不管怎样,这就是我的意图:-)
<?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);
$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);