Laravel 集合删除所有键,如果其中任何键的值为 NULL

Laravel collection remove all keys if in any of them has value NULL

对于某些计算,如果他在任何数组中有 NULL 值,我需要删除整个集合中的所有键。

例如

[
'butter'=>['iron'=>5, 'magnesium'=>3.5],
'salt'=>['iron'=>2, 'magnesium'=>2],
'egg'=>['iron'=>4, 'magnesium'=>NULL]
]

因为其中一项是空的,所以我需要新的数组这样

[
'butter'=>['iron'=>5],
'salt'=>['iron'=>2],
'egg'=>['iron'=>4]
]

我不确定我是否可以使用 Laravel 集合来完成此操作,也许使用纯 php 有更好的方法。

P.S。抱歉我的英文不太好

好的,我编写了这段代码并按我想要的方式工作,但我认为它的丑陋是有一些更好的方法使用 Laravel 集合或纯 php

$foods=[
'butter'=>['iron'=>5, 'magnesium'=>3.5, 'calcium'=>3],
'salt'=>['iron'=>2, 'magnesium'=>2, 'calcium'=>6],
'egg'=>['iron'=>4, 'magnesium'=>NULL, 'calcium'=>5]
];

$nutrientsWithNull=[];

foreach($foods as $food)
{
    foreach($food as $key=>$value){
        if(is_null($value)&&!in_array($key, $nutrientsWithNull))
        {
            $nutrientsWithNull[]=$key;
        }
    }
}

foreach($foods as $key=>$food)
{
    foreach($nutrientsWithNull as $withNull ) {
       unset($foods[$key][$withNull]);
    }

}

print_r($foods);

结果是

$foods=[
'butter'=>['iron'=>5, 'calcium'=>3],
'salt'=>['iron'=>2, 'calcium'=>6],
'egg'=>['iron'=>4, 'calcium'=>5]
];

我认为你的方法是合理的,但如果你想在这里探索其他解决方案:

public function index()
{
    $foods = [
        'butter' => ['iron' => 5, 'magnesium' => 3.5, 'calcium' => 3],
        'salt' => ['iron' => 2, 'magnesium' => 2, 'calcium' => 6],
        'egg' => ['iron' => 4, 'magnesium' => NULL, 'calcium' => 5]
    ];
    $newFoods = $this->removeNullKeys($foods);
    echo '<pre>';
    print_r($newFoods);die;
}

public function removeNullKeys(array $array): array
{
    $innerKeys = array_keys(current($array));
    $toRemove = array_reduce($innerKeys, function ($carry, $key) use ($array) {
        if (in_array(null, array_column($array, $key), true)) {
            $carry[$key] = null;
        }
        return $carry;
    }, []);

    return array_map(function ($e) use ($toRemove) {
        return array_diff_key($e, $toRemove);
    }, $array);
}

结果将是:

Array
(
    [butter] => Array
        (
            [iron] => 5
            [calcium] => 3
        )

    [salt] => Array
        (
            [iron] => 2
            [calcium] => 6
        )

    [egg] => Array
        (
            [iron] => 4
            [calcium] => 5
        )

)

希望对您有所帮助。