如何在PHP中将关联数组展平为仅包含值的数组?

4

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

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_combinearray_keysarray_values和/或array_merge来实现,最好只用一个函数,这样我就不需要使用自定义函数。

有吗?


我想知道为什么PHP全局命名空间中没有一个名为array_flatten的函数。 - jbasko
你认为这个功能值得被纳入 PHP 的本地支持吗? - aalaap
5个回答

8

你自己的解决方案可能是最干净的解决方案,因此将其转换为“一行代码”

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

1
我喜欢这个!我的array_flatten函数可能更直观易用,但我喜欢这种方法!谢谢! - aalaap
1
这些函数是“编译”还是在每个单独的步骤中处理? - Willem Van Onsem

6

以下是Just Jules的答案的PHP 5.3+版本,并且更易读:

array_walk($array, function($val, $key) use (&$answer) {
    $answer[] = $key;
    $answer[] = $val;
});

4

我认为这是不可能的 - 使用内置函数,你最终会得到所有的键和所有的值:

$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
“这是可能的,但我认为它并不更易读或更快。它可以使用 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"
}

这段代码太多了,而且这个功能只需要两行就能实现! - aalaap
有点!我应该说“<em>轻松</em>完成” :-) - aalaap

0

可以使用array_reduce来接近。

array_reduce(array_keys($arr), function($carry, $key)use($arr){
    $carry[] = $key;
    $carry[] = $arr[$key];
    return $carry;
}, array());

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