拼合阵列:保持指数值等于阵列位置 [英] Flatten Array: Keep index, value equal to position in array
问题描述
我一直有一个小麻烦试图拉平阵列以特定的方式。
下面是数组的的print_r
视图我要扁平化:
阵列
(
[1] =>排列
(
[8] => 1
[9] => 2
[10] =>排列
(
[15] =>排列
(
[22] => 1
) [21] => 2
) [11] =>排列
(
[16] =>排列
(
[23] => 1
) ) ) [2] =>排列
(
[12] => 1
) [3] =>排列
(
[13] => 1
) [4] =>排列
(
[14] => 1
) [5] =>五
[6] => 6
[7] => 7
)
我正在试图创建是这使上述指标的阵列,但值等于它的阵列中的位置,就像(从零开始)原始索引。
下面是所期望的结果:
阵列
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[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人失踪。
我的功能如下:
函数array_flatten($数组){
$结果=阵列();
$计数= 1;
而($指数=电流($阵列)){
$结果[关键($数组)] = $计数;
如果(is_array($指数)){
$结果= array_merge(array_flatten($指数),$结果);
}
下一个($数组);
$计数++;
}
返回$结果;
}
行 $结果= array_merge(array_flatten($指数),$结果);
似乎是问题。它返回:
阵列
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] =>五
[6] => 6
[7] => 7
)
但是,如果我跑的var_dump(array_flatten($指数));
在同一行,它返回所有我想合并到<$ C $阵列C> $结果变量。
阵列
22 =&GT; INT 1
排列
15 =&GT; INT 1
21 =&GT; INT 2
排列
23 =&GT; INT 1
排列
16 =&GT; INT 1
排列
8 =&GT; INT 1
9 =&GT; INT 2
10 =&GT; INT 3
11 =&GT; INT 4
排列
12 =&GT; INT 1
排列
13 =&GT; INT 1
排列
14 =&GT; INT 1
似乎是 array_merge
实际上并没有合并这些阵列。
有什么我做错了吗?指导的任何话都非常AP preciated。谢谢你。
的更新的
解决了!
其中没有所需的功能如下:
函数array_flatten($阵列,放大器和; $结果=阵列()){
$计数= 1;
的foreach($数组作为$指数=&GT; $值){
$结果[$指数] = $计数;
如果(is_array($值)){
array_flatten(价值$,$结果);
}
$计数++;
}
返回$结果;
}
函数flatten_array($阵列,放大器和; $结果){
的foreach($数组$关键=&GT; $值){
如果(is_array($值)){
flatten_array(价值$,$结果);
}其他{
$结果[$关键] = $价值;
}
}
}
要使用此功能,请检查下面的示例code:
$扁平=阵列();
$测试=阵列(
1 =&GT; 1
,3 =&GT; 2
,阵列(2 =→4,4 =→6)
,5 =&GT; 3
,阵列(7 = GT; 9,8 =大于7,9 =大于5)
);
flatten_array($测试,$扁平);
//现在$扁平包含平面数组
I've been having a little trouble trying to flatten arrays in a specific way.
Here is a print_r
view of the array I want to flatten:
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
)
What I'm attempting to create is an array which keeps the above indexes, but the value is equal to it's position in the array, much like the original index (starting from zero).
Here is the desired result:
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
)
Knowingly, 17 to 20 are missing.
My function is as follows:
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;
}
The line $result = array_merge(array_flatten($index), $result);
appears to be the problems. It returns:
Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
)
However, if I run var_dump(array_flatten($index));
on the same line, it returns all the arrays I wish to merge to the $result
variable.
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
It seems that that array_merge
doesn't actually merge these arrays.
Is there something I am doing wrong? Any words of guidance are very much appreciated. Thank you.
Update
Solved!
The function which does the required is as follows:
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;
}
function flatten_array($array, &$result) {
foreach($array as $key => $value) {
if(is_array($value)) {
flatten_array($value, $result);
} else {
$result[$key] = $value;
}
}
}
To use this, check the sample code below:
$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
这篇关于拼合阵列:保持指数值等于阵列位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!