Home » Php » php – Reorganizing an array: odd entries as KEY, even entries as VALUE

php – Reorganizing an array: odd entries as KEY, even entries as VALUE

Posted by: admin July 12, 2020 Leave a comment


I’m trying to finish up a URL router that I created for my custom MVC framework. I have a list of parameters that I dissected from the URL, but the problem is that they only have numerical keys. What I want to do is set it up so the first value in the $params array will be the KEY and then the second value in the array is the VALUE of the first KEY. But I need to take it beyond that even further. Essentially, I need all odd number key’s value in the array to be the new KEY and the even number key’s value to be the value.


This is how it’s CURRENTLY set up:

  [0] => greeting
  [1] => hello
  [2] => question
  [3] => how-are-you
  [4] => response
  [5] => im-fine

This is how it NEEDS to be (after conversion):

  [greeting] => hello
  [question] => how-are-you
  [response] => im-fine

Would it be easier to create this type of array when I explode the string by the ‘/’ delimiter when I’m taking it out of the URL string? If so, what would be the best function for that?

It’s probably a simple solution, because I’m sure this is a common issue, but any enlightenment?

How to&Answers:

Maybe use array_splice() for that?

$result = array();

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

This will extract the first two entries from the URL list and use those as key and value for the resulting array. Repeats, until the source list is empty.


Something like:

$data = array (

$new = array();

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



I don’t know if it the best solution but what I did is

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


The best way to do it is with chunking it and using it in list.

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


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

found here


just because no one else has pointed it out, this works and is at least as good as the built in functions for performance:

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