重新组织数组:奇数项作为键,偶数项作为值。

12

我正在尝试完成一个URL路由器,这是我为自定义MVC框架创建的。 我有一组从URL中解析出的参数,但问题在于它们只有数字键。 我想设置的是$params数组中第一个值将是KEY,然后数组中的第二个值是第一个KEY的VALUE。 但我需要进一步优化这个功能。 实质上,我需要把数组中所有奇数键的值作为新的KEY,偶数键的值作为VALUE。

例如:

目前设置如下:

Array
(
  [0] => greeting
  [1] => hello
  [2] => question
  [3] => how-are-you
  [4] => response
  [5] => im-fine
)
这就是转换后的样子(必须这样):
Array
(
  [greeting] => hello
  [question] => how-are-you
  [response] => im-fine
)

如果我在从URL字符串中拆分出来时,通过斜杠'/'分隔符创建这种类型的数组会更容易吗?如果是这样,最好的函数是什么?

这可能是一个简单的解决办法,因为我相信这是一个常见的问题,但是有没有任何启示呢?


我认为我理解了你的意思,直到你说你想让第一个索引(0)成为键,然后你又说你想让奇数索引成为键。你的意思是:从零开始,将第一个值作为键,第二个值作为值放入映射中,并对每个键/值对执行此操作吗? - Roger Lindsjö
7个回答

12

也许可以使用array_splice()来实现这个目的?

$result = array();

while (count($urls)) {
    list($key,$value) = array_splice($urls, 0, 2);
    $result[$key] = $value;
}

这将从URL列表中提取前两个条目,并将它们用作生成数组的键和值。重复此步骤,直到源列表为空。


我会尝试这个... 如果数组中的条目数量不均匀,它会导出错误吗? - cshoffie
1
@cshoffie 是的,会的。因为 array_splice 会产生一个只有单个元素的数组,而 list 需要两个元素。你会得到 Notice: Undefined offset: 1 in .... on line ... 的提示。 - Yoshi

1

类似于:

$data = array (
  'greeting',
  'hello',
  'question',
  'how-are-you',
  'response',
  'im-fine',
);

$new = array();

for ($i = 0, $lim = sizeof($data); $i < $lim; $i += 2) {
  $new[$data[$i]] = isset($data[$i + 1]) ? $data[$i + 1] : null;
}

print_r($new);

1

而我们都在寻找的一行代码:

array_combine(array_filter($urls, function ($k) {return !($k&1);}, ARRAY_FILTER_USE_KEY), array_filter($urls, function ($k) {return ($k&1);}, ARRAY_FILTER_USE_KEY));

0

最好的方法是将其分块并在列表中使用。

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine");

$assoc = array();
   foreach (array_chunk($array, 2) as $pair) {
   list($key, $value) = $pair;
   $assoc[$key] = $value;
}

var_export($assoc);

/*
   array (
       'greeting' => 'hello',
       'question' => 'how-are-you',
       'response' => 'im-fine',
  )
*/

{{链接1:在这里找到}}


0

只是因为没有其他人指出来,这个方法可以工作,并且至少与内置函数一样好,可以提高性能:

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine");
$res = array();
for($i=0; $i < count($array); $i+=2){
    $res[$array[$i]] = $array[$i+1];
}

0

我不知道这是否是最好的解决方案,但我所做的是

           $previousElement = null;
            foreach ($features as $key => $feature) {
                //check if key is even, otherwise it's odd
                if ($key % 2 === 0) {
                    $features[$feature] = $feature;
                } else {
                    $features[$previousElement] = $feature;
                }
                //saving element so I can "remember" it in next loop
                $previousElement = $feature;
                unset($features[$key]);
            }

0
foreach($data as $key => $value) {
  if($key % 2 === 0) {
    $final_array[$value] = $data[$key + 1];
  }
}

一些支持性的文本会有所帮助,尤其是你已经有10年时间来想出这个答案了。 - Wyck

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