非常简单:
// turn
array('foo', 'bar', 'hello', 'world');
// into
array('foo' => 'bar', 'hello' => 'world');
现在我正在使用:
do{
$arrayOut[current($arrayIn)] = next($arrayIn);
}while(next($arrayIn));
我想知道在没有中间变量$arrayOut
的情况下是否有办法做到这一点。我可以写一个函数,但这只是一个用例,我试图保持我的脚本整洁。我只是想知道在文档中是否遗漏了一些可以达到此目的的东西。
值来自路由路径:
route/to/controller/action/key1/value1/key2/value2
它爆炸了,最后在使用其他组件之后,我留下了('key1', 'value1', 'key2', 'value2', ...)
感谢大家的见解和建议。 长耳朵赢得了这个简洁的方法,当扩展到超过“1行”时,并不是非常神秘(我至少不认为)
然而,同样关于 Long Ears 的建议,也许我对语义精确的代码的渴望最小化了我的好处,而我正在追逐雏菊试图保持我的变量范围“无污染的“,自我解释。
答案 0 :(得分:5)
您可以使现有代码稍微提高效率(每次迭代删除一个函数调用,开头一个:)
$b = array();
array_unshift($a, false);
while (false !== $key = next($a)) {
$b[$key] = next($a);
}
好的,( shudder )这是你的一个班轮:
$b = call_user_func_array('array_merge', array_map(function($v) { return array($v[0] => $v[1]); }, array_chunk($a, 2)));
答案 1 :(得分:3)
您不需要数组,可以直接使用路径文本:
$path = "foo/bar/hello/world";
preg_match_all("#(?J)(?<key>[^/]+)/(?<val>[^/]*)#", $path, $p);
$params = array_combine($p['key'], $p['val']);
print_r($params);
/*
Array
(
[foo] => bar
[hello] => world
)
*/
答案 2 :(得分:2)
我认为你不能比你拥有的更好。但是当你的输入被读取时,尝试将奇数和偶数元素放在不同的数组中呢?然后,您可以使用array_combine
制作一行内容。
更新:array_map
无济于事,因为它会产生一个具有相同数量元素的数组。您可以使用array_filter
和array_combine
执行操作,但同样,这不会缩短。
我真的很喜欢你所拥有的;简短,简单,完成工作。我只是将它重构为一个函数,让我们说array_interleave_combine
或其他一些函数。
更新2 :
嗯,你问过它,所以在这里。如果你问我,试图太聪明了。是一个单行,但我真的不认为这个“纯粹”足以偿还有人需要了解正在发生的事情的时间:
$result = array_reduce(
array('foo', 'bar', 'hello', 'world'),
function($partial, $item) {
static $nextKey;
if ($nextKey === null) {
$nextKey = $item;
}
else {
$partial[$nextKey] = $item;
$nextKey = null;
}
return $partial;
});
答案 3 :(得分:1)
此解决方案不需要额外的数组:
$arr = array('foo', 'bar', 'hello', 'world');
for($i = 0, $count = count($arr); $i < $count; $i += 2)
{
$arr[$arr[$i]] = $arr[$i + 1];
unset($arr[$i], $arr[$i + 1]);
}