Как сгладить ассоциативный массив в массив только с значениями в PHP? - PullRequest
3 голосов
/ 30 мая 2009

У меня есть массив, который имеет ключи и значения. Например:

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

Я хочу преобразовать ключи из этого в значения, но я хочу, чтобы значения появлялись сразу после ключей. Например:

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

Я могу легко написать итерационную функцию, которая сделает это ... например:

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

... но я пытаюсь выяснить, можно ли как-нибудь это сделать, используя array_combine, array_keys, array_values и / или array_merge, предпочтительно в одном, поэтому я не нужно использовать пользовательскую функцию.

Есть?

Ответы [ 5 ]

6 голосов
/ 30 мая 2009

Ваше собственное решение является, пожалуй, самым чистым решением, поэтому конвертируйте его в "однострочник" :

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

Это позволяет избежать ненужных и дорогих копий или сортировки массивов.

В качестве альтернативы, потеря глобальных:

array_walk($array, create_function('$val,$key,$result', '$result[]=$key; $result[]=$val;'), &$answer);
4 голосов
/ 06 июня 2014

PHP 5.3+ версия ответа Just Jules, и немного более читабельная:

array_walk($array, function($val, $key) use (&$answer) {
    $answer[] = $key;
    $answer[] = $val;
});
3 голосов
/ 30 мая 2009

Я не думаю, что это возможно - со встроенными функциями вы получите все ключи, а затем все значения:

$a = array('a' => 'A', 'b' => 'B', 'c' => 'C');

$a = array_merge(array_keys($a), array_values($a));
print_r($a);

Вам нужно будет использовать цикл вроде этого:

$b = array();
foreach ($a as $key => $value)
{
    $b[] = $key;
    $b[] = $value;
}
2 голосов
/ 30 мая 2009

Это возможно возможно, но я не думаю, что оно будет более читабельным или быстрее. Это будет работать с менее известной функцией PHP - добавление массива :

$array = array('name' => 'aalaap', 'age' => 29, 'location' => 'mumbai');

# Separate keys and values into distinct arrays
$keys = array_keys($array);
$values = array_values($array);

# Generate 2 new array containing indexes for the 2 arrays which contain
# only odd/even numbers:
$keysKeys = range(0, count($keys) * 2 - 1, 2);
$valuesKeys = range(1, count($keys) * 2, 2);

# Combine the keys with the values and add the results:
$array = array_combine($keysKeys, $keys) + array_combine($valuesKeys, $values);

# Sort the resulting array, otherwise the numbering will be broken
# (1,3,5,2,4,6)
ksort($array);

# Result:
var_dump($array);
array(6) {
    [0]=>
        string(4) "name"
    [1]=>
        string(6) "aalaap"
    [2]=>
        string(3) "age"
    [3]=>
        int(29)
    [4]=>
        string(8) "location"
    [5]=>
        string(6) "mumbai"
}
0 голосов
/ 07 января 2015

Можно использовать array_reduce, чтобы приблизиться.

array_reduce(array_keys($arr), function($carry, $key)use($arr){
    $carry[] = $key;
    $carry[] = $arr[$key];
    return $carry;
}, array());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...