PHP:展平数组-最快的方法?
是否有任何快速的方法可以在不运行foreach循环的情况下展平数组并选择子键(“在本例中为key”和“value”),或者foreach始终是最快的方法PHP:展平数组-最快的方法?,php,arrays,Php,Arrays,是否有任何快速的方法可以在不运行foreach循环的情况下展平数组并选择子键(“在本例中为key”和“value”),或者foreach始终是最快的方法 Array ( [0] => Array ( [key] => string [value] => a simple string [cas] => 0 ) [1] => Array
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
)
)
致:
试一试:
$ret = array();
while ($el = each($array)) {
$ret[$el['value']['key']] = $el['value']['value'];
}
call\u user\u func\u array(“array\u merge”,$subarray)
可用于“展平”嵌套数组。你想要的是完全不同的东西。您可以使用带有回调的
array\u walk()
将数据提取到所需的格式。但是不,foreach循环仍然更快。没有array.*
方法来实现您的结构。这应该正确地将数组与整数键组合起来。如果键是连续的,并且从零开始,它们将被丢弃。如果整型键在平面数组中还不存在,它将保持原样;这应该主要保留非连续数组
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;
}
希望它能帮助其他人,但这里有一个函数,我用来展平数组并使嵌套元素更容易访问 此处的用法和说明: 职能:
// 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;
}
重复:我认为这个答案对你的帮助最大:有什么理由让它“最快”?有什么理由你不想使用
foreach
?哦,多么古老的运算符:)我建议总是在迭代之前使用reset($array)
初始化数组迭代器,以避免再次调用,例如end()
会把它弄糟的。很多方法都会落入这个陷阱……array\u walk本身不起作用,因为它只返回bool(并且不能修改数组的键)。
// 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;
}