Search code examples
phparraysmerging-data

Convert a flat associative array into a flat indexed array alternating the original keys then original values


I have an array that has keys and values. For eg:

Array (
    [name] => aalaap
    [age] => 29
    [location] => mumbai
)

I want to convert the keys from this into values, but I want the values to apear right after the keys. For eg:

Array (
    [0] => name
    [1] => aalaap
    [2] => age
    [3] => 29
    [4] => location
    [5] => mumbai
)

I can easily write an iteration function that will do this... for eg:

array_flatten($arr) {
    foreach ($arr as $arrkey => $arrval) {
        $arr_new[] = $arrkey;
        $arr_new[] = $arrval;
    }
    return $arr_new;
} 

...but I'm trying to find out if there's any way this can be accomplished using array_combine, array_keys, array_values and/or array_merge, preferably in one, so i don't need to use a custom function.

Is there?


Solution

  • Your own solution is probably the cleanest solution, so converting it to a "one-liner":

    $array = array('name' => 'aalaap','age' => 29, 'location' => 'mumbai');
    $answer = array();
    
    array_walk($array, create_function('$val,$key', 'global $answer; $answer[]=$key; $answer[]=$val;'));
    
    var_dump($answer);
    

    This avoids unnecessary and expensive array copies or sorting.

    Alternatively, lose the global:

    array_walk($array, create_function('$val,$key,$result', '$result[]=$key; $result[]=$val;'), &$answer);