将数组排序为关联数组,奇数值作为键

时间:2011-03-09 01:12:27

标签: php arrays associative-array

非常简单:

// 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 的建议,也许我对语义精确的代码的渴望最小化了我的好处,而我正在追逐雏菊试图保持我的变量范围“无污染的“,自我解释。

4 个答案:

答案 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_filterarray_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]);
}
相关问题