Php 我的多维数组合并中的2是如何出现的?
我正在尝试合并多维度数组中键的重复值Php 我的多维数组合并中的2是如何出现的?,php,arrays,Php,Arrays,我正在尝试合并多维度数组中键的重复值 $subjects = array( array( 'class' => 'one', 'sub' => 'music', ), array( 'class' => 'one', 'sub' => array( 'social', 'health', 'science' ), ),
$subjects = array(
array(
'class' => 'one',
'sub' => 'music',
),
array(
'class' => 'one',
'sub' => array( 'social', 'health', 'science' ),
),
array(
'class' => 'two',
'sub' => 'music',
),
array(
'class' => 'one',
'sub' => 'math',
)
);
在上面,我需要找到公共类并将它们的子类合并到一个数组中。因此,预期输出如下所示:
Array
(
[0] => Array
(
[class] => one
[sub] => array( 'music', 'social', 'health', 'science', 'math' )
)
[1] => Array
(
[class] => two
[sub] => music
)
)
我正试图得到那个结果,但我不知从哪里得到了2
$class_sub = array();
$result = array();
foreach( $subjects as $sub ) {
if ( ! isset( $class_sub[ $sub['class'] ] ) ) {
$class_sub[ $sub['class'] ] = $sub['sub'];
} else {
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;
}
}
foreach( $class_sub as $class => $sub ) {
$result[] = array(
'class' => $class,
'sub' => $sub
);
}
echo "<pre>"; print_r( $result ); echo "</pre>";
如何实现
2
以及如何实现期望的结果?谢谢。问题是您使用不正确。函数返回数组中的元素数,而不是数组本身-在第一个参数中将项目添加到数组中,即$class\u sub[$sub['class']]]
您的代码中包含以下内容:
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);
}
这里发生的事情是数组被添加到一起,然后数组项的计数($new
)被添加到$class\u sub[$sub['class']]
请改为尝试此操作-这不会覆盖$class\u sub[$sub['class']]]
,它使用数组合并将数组添加到一起(这将替换整个foreach($subject as$sub)
块,而不仅仅是上面的代码):
返回新数组中的元素数,而不是更改的数组,这就是为什么在输出中得到2
。这不是您唯一的问题,因为您需要考虑到$sub
也可以是一个数组,在这种情况下,使用array\u push
将在输出中为您提供一个数组。相反,请使用:
示例数据的输出:
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;
}
出于好奇,我编写了自己版本的函数。因此,这不是对您的问题的直接回答,但是,这里的其他人可能仍然感兴趣,他们正试图以您指定的方式“合并”数组 有关演示,请单击此处:
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);
}
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
)
)
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;
}