3 回答
TA贡献1785条经验 获得超8个赞
array_push
返回新数组中的元素数量,而不是更改后的数组,这就是您进入2
输出的原因。但这不是您唯一的问题,因为您需要考虑到它$sub
也可以是一个数组,在这种情况下,使用array_push
将在输出中为您提供一个数组数组。相反,使用array_merge
:
if ( is_array( $class_sub[ $sub['class'] ] ) ) {
$new = array_merge( $class_sub[ $sub['class'] ], is_array($sub['sub']) ? $sub['sub'] : array($sub['sub']));
} else {
$new = array_merge( array($class_sub[ $sub['class'] ]), is_array($sub['sub']) ? $sub['sub'] : array($sub['sub']));
}
示例数据的输出:
Array
(
[0] => Array
(
[class] => one
[sub] => Array
(
[0] => music
[1] => social
[2] => health
[3] => science
[4] => math
)
)
[1] => Array
(
[class] => two
[sub] => music
)
)
TA贡献1942条经验 获得超3个赞
问题是你使用方法array_push
不对。该函数返回数组中的元素数量,而不是数组本身 - 这些项目在第一个参数中添加到数组中,即$class_sub[ $sub['class'] ]
你的代码中有这个:
if ( is_array( $class_sub[ $sub['class'] ] ) ) {
$new = array_push( $class_sub[ $sub['class'] ], $sub['sub'] );
} else {
$new[] = $sub['sub'];
}
$class_sub[ $sub['class'] ] = $new;
这里发生的情况是,数组被添加到一起,然后数组项的计数$new( ) 被添加到$class_sub[ $sub['class'] ]。
试试这个 - 这不会覆盖$class_sub[ $sub['class'] ],它使用 array_merge 将数组添加在一起(这替换了整个foreach( $subjects as $sub )块,而不仅仅是上面的代码):
foreach( $subjects as $sub ) {
/* prepare subjects as an array */
if ( is_array( $sub['sub'] ) ) $subjects = $sub['sub'];
else $subjects = array($sub['sub']);
if ( ! isset( $class_sub[ $sub['class'] ] ) )
/* if this is the first subject for this class, there is no array to merge with */
$class_sub[ $sub['class'] ] = $subjects;
else
/* We know both class and subject are arrays so we can merge them */
$class_sub[$sub['class']] = array_merge( $class_sub[ $sub['class'] ], $subjects);
}
TA贡献1887条经验 获得超5个赞
出于好奇,我编写了您自己的函数版本。因此,这不是对您问题的直接答案,但也许,这里的其他人仍然感兴趣,他们试图按照您指定的方式“合并”数组。
function amerge($arr){
foreach ($arr as $e){
$sub=is_array($e["sub"])?$e["sub"]:array($e["sub"]);
foreach ($sub as $s) $p[$e["class"]][$s]=1;
}
$classes=array_keys($p);
foreach ($classes as $c)
$out[]=array("class"=>$c,"sub"=>array_keys($p[$c]));
return $out;
}
如需演示,请点击此处: https: //rextester.com/QKULS37967
- 3 回答
- 0 关注
- 109 浏览
添加回答
举报