【问题标题】:PHP - Set array key only if the value is not nullPHP - 仅当值不为空时才设置数组键
【发布时间】:2018-01-15 16:29:40
【问题描述】:

这样的事情有更短的解决方案吗?

$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 时,它们甚至不应该存在:

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

编辑:

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

【问题讨论】:

  • foreach (['name', 'link', ...] as $key) if (!is_null($params->get($key))) ... 也许……?

标签: php arrays


【解决方案1】:

对于@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】:
    $keys = ['name', 'link', ....];
    foreach ($keys as $key) {
        if(!is_null($params->get($key))){
            $manufacturer[$key] = $params->get($key);
        }
    }
    

    【讨论】:

    • 好吧,那是可能的,但我认为没有 foreach 可能还有别的东西。因为数组键和参数键有时可能会有所不同,最重要的是,我还有另一个数组,其中包含该数组中的值。使用 foreach 仍然可以,但我认为不会更好。
    • 此解决方案仅适用于简单数组,它不会从多维数组中删除空值
    • @Nano 那么您应该编辑您的问题以提供更多详细信息。现在看来,您需要处理有限的一组键和简单的值。如果您需要处理多维数组,那将是另一种情况。
    • @Nima 你说得对,@Nono 你能编辑你的问题吗
    【解决方案3】:

    foreach 解决方案是可能的,但是由于数组键和参数键可能会有所不同,并且因为我在这个数组中有另一个包含值的数组,所以这可能是一个更好的解决方案,或者你觉得呢?

    $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 使用回调)

    【讨论】:

    • 此解决方案仅适用于简单数组,它不会从多维数组中删除空值
    猜你喜欢
    • 2012-03-10
    • 2016-02-29
    • 2013-03-09
    • 2016-08-29
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多