Flatten Array:保持索引,值等于数组中的位置
Posted
技术标签:
【中文标题】Flatten Array:保持索引,值等于数组中的位置【英文标题】:Flatten Array: Keep index, value equal to position in array 【发布时间】:2011-10-06 09:56:31 【问题描述】:我在尝试以特定方式展平数组时遇到了一些麻烦。
这是我想要展平的数组的print_r
视图:
Array
(
[1] => Array
(
[8] => 1
[9] => 2
[10] => Array
(
[15] => Array
(
[22] => 1
)
[21] => 2
)
[11] => Array
(
[16] => Array
(
[23] => 1
)
)
)
[2] => Array
(
[12] => 1
)
[3] => Array
(
[13] => 1
)
[4] => Array
(
[14] => 1
)
[5] => 5
[6] => 6
[7] => 7
)
我试图创建的是一个保留上述索引的数组,但该值等于它在数组中的位置,很像原始索引(从零开始)。
这是想要的结果:
Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 1
[9] => 2
[10] => 3
[11] => 4
[12] => 1
[13] => 1
[14] => 1
[15] => 1
[16] => 1
[21] => 2
[22] => 2
[23] => 1
)
明知有 17 到 20 个缺失。
我的功能如下:
function array_flatten ($array)
$result = array ();
$count = 1;
while ($index = current($array))
$result[key($array)] = $count;
if (is_array($index))
$result = array_merge(array_flatten($index), $result);
next($array);
$count++;
return $result;
$result = array_merge(array_flatten($index), $result);
行似乎是问题所在。它返回:
Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
)
但是,如果我在同一行运行 var_dump(array_flatten($index));
,它会返回我希望合并到 $result
变量的所有数组。
array
22 => int 1
array
15 => int 1
21 => int 2
array
23 => int 1
array
16 => int 1
array
8 => int 1
9 => int 2
10 => int 3
11 => int 4
array
12 => int 1
array
13 => int 1
array
14 => int 1
看来array_merge
实际上并没有合并这些数组。
我做错了什么吗?任何指导的话都非常感谢。谢谢。
更新
解决了!
需要的函数如下:
function array_flatten($array, &$result = array())
$count = 1;
foreach($array as $index => $value)
$result[$index] = $count;
if(is_array($value))
array_flatten($value, $result);
$count++;
return $result;
【问题讨论】:
如何在您想要的结果中将 4 变成 4 ([4] => 4
)?并且请将您的问题降到最低限度,否则会不必要地难以理解和回答。
@hakre - 似乎 [4]=>4
因为最外面的数组有 7 个元素,第 4 个有索引“4”,@Aleks - 你提到了 array_merge,但我在你的代码在任何地方。
@Aleks - 另外,如果您提供一些代码来定义您的测试数组,这可能会有所帮助。
@timdev - 抱歉,array_flatten(array_flatten($index), $result);
应该是 array_merge(array_flatten($index), $result);
。
@timdev:这些数组问题需要print_r converter。
【参考方案1】:
function flatten_array($array, &$result)
foreach($array as $key => $value)
if(is_array($value))
flatten_array($value, $result);
else
$result[$key] = $value;
要使用它,请查看下面的示例代码:
$flattened = array();
$test = array(
1 => 1
, 3 => 2
, array(2 => 4, 4 => 6)
, 5 => 3
, array(7 => 9, 8 => 7, 9 => 5)
);
flatten_array($test, $flattened);
// Now $flattened contains the flattened array
【讨论】:
有效!但是,它会引发以下错误:警告:array_flatten() 缺少参数 2,在第 11 行的 C:/file/update.php 中调用并在第 58 行的 C:/file/update.php 中定义。第 58 行是函数定义,即function flatten_array($array, &$result)
.
解决了。 function flatten_array($array, &$result = array())
;) 再次感谢。
如果你想使用展平的数组(并且你想这样做,否则你不会费心去展平它)你需要第二个参数的值。因此,您需要获取一个空数组并将其作为第二个参数分配给函数。我会更新答案以解释我的意思。
能否将4 => 6
替换为14 => 6
,然后测试元素4
是否返回?我认为那个漏掉了。
我只能引用:"@hakre - 似乎 [4]=>4 因为最外面的数组有 7 个元素,第 4 个有索引“4” [... ] – timdev 3 hours ago" 与有问题的原始数据进行比较。但是离开它。 ;)【参考方案2】:
在你澄清你的问题后,我有点惊讶你接受了一个没有返回你期望的数据的答案。 (我现在看到您为您的问题添加了您的解决方案。)
我做了什么:我以@Arjan 的函数为基础,在问题输入数据上运行它,并将其与问题预期数据进行比较。然后我做了一点。这就是我想出的(结果):
# COMP EXPECTED . ACTUAL
#00: == Array . Array
#01: == ( . (
#02: == [1] => 1 . [1] => 1
#03: == [2] => 2 . [2] => 2
#04: == [3] => 3 . [3] => 3
#05: == [4] => 4 . [4] => 4
#06: == [5] => 5 . [5] => 5
#07: == [6] => 6 . [6] => 6
#08: == [7] => 7 . [7] => 7
#09: == [8] => 1 . [8] => 1
#10: == [9] => 2 . [9] => 2
#11: == [10] => 3 . [10] => 3
#12: == [11] => 4 . [11] => 4
#13: == [12] => 1 . [12] => 1
#14: == [13] => 1 . [13] => 1
#15: == [14] => 1 . [14] => 1
#16: == [15] => 1 . [15] => 1
#17: == [16] => 1 . [16] => 1
#18: == [21] => 2 . [21] => 2
#19: != [22] => 2 . [22] => 1
#20: == [23] => 1 . [23] => 1
#21: == ) . )
#22: == .
您的预期数据似乎对位置 22 有错误。
这是修改后的函数(Demo):
function flatten_array($array, &$result = null)
$r = null === $result;
$i = 0;
foreach($array as $key => $value)
$i++;
if(is_array($value))
$result[$key] = $i;
flatten_array($value, $result);
else
$result[$key] = $value;
if ($r)
ksort($result);
return $result;
$actual = flatten_array($input);
【讨论】:
以上是关于Flatten Array:保持索引,值等于数组中的位置的主要内容,如果未能解决你的问题,请参考以下文章
php PHP array_flatten()函数。将多维数组转换为一维数组。