使用value = NULL从数组中删除条目

时间:2011-12-27 10:29:30

标签: php

  

可能重复:
  remove element from array based on its value?

我有这个数组

$arr = array(
 'key1'=>'value1',
 'key2'=>NULL,
 'key3'=>'value2'
);

如果我implode(',',$arr);我得到:value1,,value2(注意空白区域)

有没有办法跳过那个NULL值?得到这样的东西:

value1,value2

我可以遍历所有数组并手动取消设置值为NULL的键,但这有点过分了吗?

编辑:

为了节省时间也许我只能做一个循环来迭代数组,并且在同一个循环中我检查空值,如果不是空,我将它追加到','

像这样:

foreach($arr as $k=>$v) {
  if ($v !== NULL) {
   echo $v.',';
  }
}

这里的问题是我有一个决赛''最后。

修改

正如戈登所说,它运行了这个测试(1000000次迭代)

首先使用array_filter:

$pairsCache = array('key1'=>'value1','key2'=>NULL,'key3'=>'value3',
                    'key4'=>'value4','key5'=>'value5');

for($i=0;$i<1000000;$i++) {

    $query = "INSERT INTO tbl (";
    $keys='';
    $values='';

    $pairs = array_filter($pairsCache,function($v){return $v !== NULL;});

    $keys = array_keys($pairs);

    //> keys    
    $query .= implode(',',$keys ) . ") VALUES ( '";

    //> values
    $query .= implode("','",$pairs) . "')";
}

时间: 7.5949399471283
查询:&#34; INSERT INTO tbl (key1,key3,key4,key5) VALUES ( 'value1','value3','value4','value5')&#34;

第二次只使用一个循环:

for($i=0;$i<1000000;$i++) {

    $query = "INSERT INTO tbl (";
    $keys='';
    $values='';

    foreach($pairsCache as $k=>$v) {
        if ($v!==NULL) {

            $keys .= $k.',';
            $values .= "'{$v}',";
        }
     }

    $keys=rtrim($keys,',');
    $values=rtrim($values,',');

    $query = $query . $keys . ') VALUES ( ' . $values . ')';

 }

时间: 4.1640941333771
查询:INSERT INTO tbl (key1,key3,key4,key5,) VALUES ( 'value1','value3','value4','value5')

4 个答案:

答案 0 :(得分:5)

$arr = array_filter($arr);

array_filter()会移除评估为false的{​​{1}}的所有值。

如果需要更好的控制,可以将回调作为第二个参数传递

$arr

最后你可以自己迭代数组

arr = array_filter($arr, function ($item) { return !is_null($item);});

请注意,如果您在两个单独的步骤中过滤和输出

,则没有任何缺点

答案 1 :(得分:0)

您可以使用array_filter()

If no callback is supplied, all entries of input equal to FALSE (see converting to boolean) will be removed.

implode(',', array_filter($arr));

答案 2 :(得分:0)

您可以简单地使用以下代码。

<强>编辑。

function nullFilter($val)
{
    return $val !== NULL;
}
$arr = array( 'key1'=>'value1', 'key2'=>NULL, 'key3'=>'value2' );

$filteredArray = array_filter($arr,"nullFilter");

echo implode(',', $filteredArray);

干杯!

普拉萨德。

答案 3 :(得分:0)

仅使用implode()无法执行此操作。

您可以在包装器my_implode()函数中遍历所有数组(如您所说),或者您可以使用不太优雅的内容,例如:

trim(preg_replace('/[,]+/', ',', implode(',', $arr)), ',');