Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 合并2个具有空值的数组_Php_Arrays_Multidimensional Array - Fatal编程技术网

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);