有没有快速的方法来展平数组并选择子键(在这种情况下为'key'&'value')而不运行foreach循环,或者foreach总是最快的方式?
Array
(
[0] => Array
(
[key] => string
[value] => a simple string
[cas] => 0
)
[1] => Array
(
[key] => int
[value] => 99
[cas] => 0
)
[2] => Array
(
[key] => array
[value] => Array
(
[0] => 11
[1] => 12
)
[cas] => 0
)
)
要:
Array
(
[int] => 99
[string] => a simple string
[array] => Array
(
[0] => 11
[1] => 12
)
)
答案 0 :(得分:3)
试一试:
$ret = array();
while ($el = each($array)) {
$ret[$el['value']['key']] = $el['value']['value'];
}
答案 1 :(得分:3)
call_user_func_array("array_merge", $subarrays)
可用于“展平”嵌套数组
你想要的是完全不同的东西。您可以使用带有回调的array_walk()
来将数据提取为所需的格式。但不,foreach循环仍然更快。否则,没有array_*
方法来实现您的结构。
答案 2 :(得分:0)
希望它会对其他人有所帮助,但这是我用来平整数组并使嵌套元素更易于访问的功能。
此处的用法和说明: https://totaldev.com/flatten-multidimensional-arrays-php/
功能:
// Flatten an array of data with full-path string keys
function flat($array, $separator = '|', $prefix = '', $flattenNumericKeys = false) {
$result = [];
foreach($array as $key => $value) {
$new_key = $prefix . (empty($prefix) ? '' : $separator) . $key;
// Make sure value isn't empty
if(is_array($value)) {
if(empty($value)) $value = null;
else if(count($value) == 1 && isset($value[0]) && is_string($value[0]) && empty(trim($value[0]))) $value = null;
}
$hasStringKeys = is_array($value) && count(array_filter(array_keys($value), 'is_string')) > 0;
if(is_array($value) && ($hasStringKeys || $flattenNumericKeys)) $result = array_merge($result, flat($value, $separator, $new_key, $flattenNumericKeys));
else $result[$new_key] = $value;
}
return $result;
}
答案 3 :(得分:-1)
这应该正确地将数组与整数键组合在一起。如果密钥是连续的并且从零开始,则它们将被丢弃。如果扁平数组中尚未存在整数键,则它将保持原样;这应该主要保留不连续的数组。
function array_flatten(/* ... */)
{
$flat = array();
array_walk_recursive(func_get_args(), function($value, $key)
{
if (array_key_exists($key, $flat))
{
if (is_int($key))
{
$flat[] = $value;
}
}
else
{
$flat[$key] = $value;
}
});
return $flat;
}
您可以使用!isset($key)
或empty($key)
来支持有用的值。
这是一个更简洁的版本:
function array_flatten(/* ... */)
{
$flat = array();
array_walk_recursive(func_get_args(), function($value, $key) use (&$flat)
{
$flat = array_merge($flat, array($key => $value));
});
return $flat;
}