在 PHP 中如何使用键和值而不使用 foreach 实现数组内爆

没有了 Foreach, 我怎样才能像这样转动一个数组呢

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

像这样的绳子

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

我已经想过 implode()了,但它没有把钥匙内爆。

如果有必要的话,有没有可能不在树上筑巢呢?

编辑: 我已经更改了字符串


编辑2/更新: 这个问题问了很久了。那时,我想把所有内容都写在一行中,这样我就可以使用三元运算符和嵌套内置的函数调用来支持 foreach。那可不是什么好习惯!编写可读的代码,无论它是否简洁并不重要。

在这种情况下: 将 foreach 放在函数中比编写一行程序更具可读性和模块化(尽管所有的答案都很棒!).

200733 次浏览

我会使用 serialize()json_encode()

虽然它不会给出您想要的确切结果字符串,但是稍后编码/存储/检索/解码会容易得多。

改变

-    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, ",");

你可以像这样使用 http_build_query:

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

产出:

item1=object1, item2=object2

演示

还有另一种方式:

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

使用 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

为了调试的目的。递归地将嵌套数组的数组写入一个字符串。 使用 foreach。函数存储国家语言字符。

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";
}

我花了测量(100000次迭代) ,什么最快的方法胶水一个关联数组?

Objective: 要获得包含1000个项目的行,格式为: “ key: value,key2: value2”

我们有数组(例如) :

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

测试一:

使用 Http _ build _ queryStr _ place:

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

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

测试二:

使用 Array _ map内爆:

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

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

第三个测试:

使用 Array _ walk内爆:

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

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

第四个测试:

使用 Foreach:

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

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

我可以得出结论,粘合数组的最佳方法是使用 http _ build _ query 和 str _ place

你也可以使用 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");

用于创建 mysql,其中条件来自 array

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

下面是一个简单的例子,使用 class:

$input = array(
'element1'  => 'value1',
'element2'  => 'value2',
'element3' =>  'value3'
);


echo FlatData::flatArray($input,', ', '=');


class FlatData
{


public static function flatArray(array $input = array(), $separator_elements = ', ', $separator = ': ')
{
$output = implode($separator_elements, array_map(
function ($v, $k, $s) {
return sprintf("%s{$s}%s", $k, $v);
},
$input,
array_keys($input),
array_fill(0, count($input), $separator)
));
return $output;
}


}

从任何字符串中获取数组都可以,因为数组始终是标准结构。

但是对于数组到字符串,有什么理由在代码中使用预定义的字符串吗?而字符串应该在任何格式使用!

Foreach 的好处是您可以根据需要创建字符串! 我建议仍然使用 foreach 安静可读和干净。

$list = array('a'=>'1', 'b'=>'2', 'c'=>'3');


$sql_val = array();
foreach ($list as $key => $value) {
$sql_val[] = "(" . $key . ", '" . $value . "') ";
}
$sql_val = implode(', ', $sql_val);

结果:

(a, '1') , (b, '2') , (c, '3')

|

(a: '1') , (b: '2') , (c: '3')

|

a:'1' , b:'2' , c:'3'

等等。

简而言之:

$string = implode('; ', array_map(fn($k, $v) => "$k=$v", array_keys($array), $array));

另外,如果问题已经过时,并且不再需要解决方案,那么我就需要打印一个数组来进行调试(抛出一个异常并显示导致问题的数组)。

出于这个原因,无论如何,我提出了我的简单解决方案(一行,就像最初问的那样) :

$array = ['a very' => ['complex' => 'array']];
$imploded = var_export($array, true);

这将返回导出的 var,而不是直接在屏幕上打印它,var $內爆将包含完整的导出。