我有这个数组
$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')
答案 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)), ',');