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
)
)
希望对您有所帮助。
对于某些计算,如果他在任何数组中有 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
)
)
希望对您有所帮助。