如何在没有foreach的情况下在PHP中使用键和值爆炸数组

没有foreach ,我怎么可以像这样打开一个数组

array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n"); 

像这样的string

 item1='object1', item2='object2',.... item-n='object-n' 

我已经想过implode()了,但是它并没有把它带入关键。

如果foreach有必要的话,是不是可以嵌套这个foreach呢?

编辑:我已经改变了string


编辑2 /更新:这个问题很早以前就被问到了。 那时候,我想把所有东西写在一行,所以我会使用三元运算符和嵌套的函数调用来支持foreach。 这不是一个好的做法! 编写可读的代码,不pipe它是简洁还是不重要。

在这种情况下:将foreach放在一个函数中将比编写一行代码更具可读性和模块化(即使所有的答案都很棒!)。

另一种方式:

 $input = array( 'item1' => 'object1', 'item2' => 'object2', 'item-n' => 'object-n' ); $output = implode(', ', array_map( function ($v, $k) { if(is_array($v)){ return $k.'[]='.implode('&'.$k.'[]=', $v); }else{ return $k.'='.$v; } }, $input, array_keys($input) )); 

要么:

 $output = implode(', ', array_map( function ($v, $k) { return sprintf("%s='%s'", $k, $v); }, $input, array_keys($input) )); 

你可以使用http_build_query ,像这样:

 <?php $a=array("item1"=>"object1", "item2"=>"object2"); echo http_build_query($a,'',', '); ?> 

输出:

 item1=object1, item2=object2 

演示

我花了测量(100000次迭代),什么最快的方式来粘贴关联数组?

目标:获得一行1000个项目,格式如下:“key:value,key2:value2”

我们有数组(例如):

 $array = [ 'test0' => 344, 'test1' => 235, 'test2' => 876, ... ]; 

testing第一名:

使用http_build_querystr_replace

 str_replace('=', ':', http_build_query($array, null, ',')); 

内爆1000个元素的平均时间:0.00012930955084904

testing二:

使用array_mapimplode

 implode(',', array_map( function ($v, $k) { return $k.':'.$v; }, $array, array_keys($array) )); 

爆炸1000个元素的平均时间:0.0004890081976675

testing三:

使用array_walkimplode

 array_walk($array, function (&$v, $k) { $v = $k.':'.$v; } ); implode(',', $array); 

内爆1000个元素的平均时间:0.0003874126245348

testing四:

使用foreach

  $str = ''; foreach($array as $key=>$item) { $str .= $key.':'.$item.','; } rtrim($str, ','); 

内爆1000个元素的平均时间:0.00026632803902445

我可以得出结论,粘贴数组的最佳方法是使用http_build_query和str_replace

我会使用serialize()json_encode()

虽然它不会给你想要的确切的结果string,但稍后编码/存储/检索/解码会容易得多。

使用array_walk

 $a = array("item1"=>"object1", "item2"=>"object2","item-n"=>"object-n"); $r=array(); array_walk($a, create_function('$b, $c', 'global $r; $r[]="$c=$b";')); echo implode(', ', $r); 

IDEONE

更改

 - return substr($result, (-1 * strlen($glue))); + return substr($result, 0, -1 * strlen($glue)); 

如果你想阻止整个string没有最后$胶水

 function key_implode(&$array, $glue) { $result = ""; foreach ($array as $key => $value) { $result .= $key . "=" . $value . $glue; } return substr($result, (-1 * strlen($glue))); } 

用法:

 $str = key_implode($yourArray, ","); 

为了debugging目的。 recursion将嵌套数组的数组写入一个string。 用过的foreach。 function存储国家语言字符。

 function q($input) { $glue = ', '; $function = function ($v, $k) use (&$function, $glue) { if (is_array($v)) { $arr = []; foreach ($v as $key => $value) { $arr[] = $function($value, $key); } $result = "{" . implode($glue, $arr) . "}"; } else { $result = sprintf("%s=\"%s\"", $k, var_export($v, true)); } return $result; }; return implode($glue, array_map($function, $input, array_keys($input))) . "\n"; } 

你也可以使用PHP的array_reduce ,

 $a = ['Name' => 'Last Name']; function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";} $imploded = array_reduce(array_keys($a), "acc"); 

用于从数组中创buildmysql的条件

 $sWheres = array('item1' => 'object1', 'item2' => 'object2', 'item3' => 1, 'item4' => array(4,5), 'item5' => array('object3','object4')); $sWhere = ''; if(!empty($sWheres)){ $sWhereConditions = array(); foreach ($sWheres as $key => $value){ if(!empty($value)){ if(is_array($value)){ $value = array_filter($value); // For remove blank values from array if(!empty($value)){ array_walk($value, function(&$item){ $item = sprintf("'%s'", $item); }); // For make value string type 'string' $sWhereConditions[] = sprintf("%s in (%s)", $key, implode(', ', $value)); } }else{ $sWhereConditions[] = sprintf("%s='%s'", $key, $value); } } } if(!empty($sWhereConditions)){ $sWhere .= "(".implode(' AND ', $sWhereConditions).")"; } } echo $sWhere; // (item1='object1' AND item2='object2' AND item3='1' AND item4 in ('4', '5') AND item5 in ('object3', 'object4'))