PHP - 仅当值不为null时才设置数组键

时间:2017-08-08 08:02:37

标签: php arrays

对于类似的东西,是否有更短的解决方案?

$manufacturer = array();

if(!is_null($params->get('name'))){
    $manufacturer['name'] = $params->get('name');
}

if(!is_null($params->get('link'))){
    $manufacturer['link'] = $params->get('link');
}

if(!is_null($params->get('description'))){
    $manufacturer['description'] = $params->get('description');
}

...

因此,如果值不为null,则只应使用值设置数组的键。这有点短,但使用此解决方案,键将存在值NULL。但是当值为NULL时,它们甚至不应该存在:

$manufacturer = array(
    'name' => !is_null($params->get('name')) ? $params->get('name') : null,
    'link' => !is_null($params->get('link')) ? $params->get('link') : null,
     'description' => !is_null($params->get('description')) ? $params->get('description') : null
);

编辑:

它应该适用于多维数组,数组键和参数键可能会有所不同

3 个答案:

答案 0 :(得分:3)

$keys = ['name', 'link', ....];
foreach ($keys as $key) {
    if(!is_null($params->get($key))){
        $manufacturer[$key] = $params->get($key);
    }
}

答案 1 :(得分:2)

对于@u_mulder foreach和@Nono array_filter解决方案,它们只适用于简单数组,它们不会从多维数组中删除空值,

试试这个递归函数:

<?php
/**
 just keep your array like this:

$manufacturer = array(
    'name' => $params->get('name'),
    'link' => $params->get('link'),
    'description' => $params->get('description'),
    'attribute' => array (
        'street' => $params->get('street'),
        ...
    )
    ...
);
**/

$manufacturer = [
    'name' => 'yoeunes',
    'link' => null,
    'description' => 'fake description',
    'attribute' => [
        'street' => null,
        'city'   => 'Marrakech',
    ],
];

function array_remove_null($array)
{
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $array[$key] = array_remove_null($array[$key]);
        }

        if (is_null($array[$key])) {
            unset($array[$key]);
        }
    }

    return $array;
}

echo "<pre>";
print_r(array_remove_null($manufacturer));

<强>输出:

Array
(
    [name] => yoeunes
    [description] => fake description
    [attribute] => Array
        (
            [city] => Marrakech
        )

)

答案 2 :(得分:0)

foreach解决方案是可行的,但由于数组键和params键可能会有所不同,因为我有另一个数组在这个数组中有值,这可能是一个更好的解决方案,或者你怎么看?

$manufacturer = array(
    'name' => !is_null($params->get('name')) ? $params->get('name') : false,
    'link' => !is_null($params->get('link')) ? $params->get('link') : false,
    'description' => !is_null($params->get('description')) ? $params->get('description') : false,
    'attribute' => array (
        'street' => !is_null($params->get('street')) ? $params->get('street') : false,
        ...
    )
    ...
);
$manufacturer = array_filter($manufacturer);

array_filter(没有回调)将删除所有带有false的键。 (可能只要我的键没有布尔值。如果是这样,你可以用NULL做同样的事情,然后使用array_filter的回调)