如何在PHP中将数组的键和值组合在一起

10
假设我在PHP中有一个键值对数组:
array( 'foo' => 'bar', 'baz' => 'qux' );

最简单的方法是将它转换为以下形式的数组是什么?
array( 'foo=bar', 'baz=qux' );

即(即是)
array( 0 => 'foo=bar', 1 => 'baz=qux');

在Perl中,我会做类似的事情。
map { "$_=$hash{$_}" } keys %hash

在PHP的数组函数库中有类似的功能吗?我查看了所有的选项,但似乎没有一个方便的解决方案。
4个回答

19

解决该问题的另一个选择:在 PHP 5.3+ 中,您可以使用带有闭包的 array_map() 函数(在PHP 5.2之前也可以这样做,但代码会变得非常混乱!)。

"哦,但是在 array_map() 中,您只能获取值!"

是的,没错,但我们可以映射多个数组! :)

$arr = array( 'foo' => 'bar', 'baz' => 'qux' );
$result = array_map(function($k, $v){
    return "$k=$v";
}, array_keys($arr), array_values($arr));

2
在 PHP 8+ 中,由于新的 fn 语法,它甚至更简单:
$result = array_map(fn($k, $v) => "$k=$v", array_keys($arr), array_values($arr));
- Guillaume Boudreau

10
function parameterize_array($array) {
    $out = array();
    foreach($array as $key => $value)
        $out[] = "$key=$value";
    return $out;
}

我接受这个答案,因为它很直接,也是我最终解决问题的方法。我很失望没有办法用单个表达式来完成,避免需要临时变量 $out 的需求。 - nohat
3
如果你是Perl用户,那么在使用PHP的过程中,这只是你会遇到的许多失望之一。 - chaos
@chaos 是啊,生活很艰难,php很可读。 @nohat 虽然这并不符合你问题中所规定的“转换”数组,但它创建了一个新数组。“一系列数组函数”?哈哈大笑。 - GZipp
@GZippпјҡжҳҜзҡ„пјҢ$foo = isset($bar['baz']) ? $bar['baz'] : 'qxx'жҜ”$foo = $bar[baz] || 'qxx'еҸҜиҜ»жҖ§й«ҳеӨҡдәҶгҖӮзңҹжғідёҚеҮәеҪ“ж—¶жҲ‘еңЁжғід»Җд№ҲгҖӮ - chaos
嗯,"?: "运算符被添加到PHP中,以便像Perl一样的编码人员可以将所有内容放在一行上;我认为你会喜欢这个功能。 - GZipp
我很喜欢条件运算符。但我不太喜欢被削弱和损坏的逻辑OR和逻辑AND运算符。 - chaos

5
一种“好奇”的方法来实现 =P
// using '::' as a temporary separator, could be anything provided
// it doesn't exist elsewhere in the array
$test = split( '::', urldecode( http_build_query( $test, '', '::' ) ) );

我想到了相同的解决方案,但是我对编码/解码过程是否单义性感到“好奇”。我尝试将其用于ORM中查询条件的快速排列,但由于urlencode/urldecode时数据安全性的疑虑,因此有些犹豫。 - Paul T. Rawkeen

0

chaos的回答很好,直截了当。不过,更一般的情况是,您可能错过了array_map()函数,这就是您在map { "$_=$hash{$_}" } keys %hash示例中所暗示的。


1
array_map()函数似乎只返回数组的值。 - nohat
不幸的是,在 PHP 5.3 以下,严格等效的代码是使用 create_function() 的可怕代码。 - chaos
啊,nohat,如果你需要键值,那么你可以尝试使用array_walk()(虽然它会直接修改原数组而不是返回一个新的数组)。 - Amber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接