我试图订购这个多维数组,但没有成功。我需要按pub_obs
升序排序,但保持主数组顺序(AC,BA,..)。主数组(0,1,2,..)内的索引可以更改,但pub_id
必须相同。
Array(
[AC] => Array
(
[0] => Array
(
[pub_id] => 1
[pub_obs] => c
)
[1] => Array
(
[pub_id] => 3
[pub_obs] => a
)
[2] => Array
(
[pub_id] => 4
[pub_obs] => c
)
)
[BA] => Array
(
[0] => Array
(
[pub_id] => 1
[pub_obs] => b
)
[1] => Array
(
[pub_id] => 2
[pub_obs] => b
)
[2] => Array
(
[pub_id] => 7
[pub_obs] => a
)
)
)
有人可以帮忙吗?谢谢!
修改
我忘了说PHP版本5.2,但@ fusion3k很快!感谢答案的家伙以及所有帮助过的人!
答案 0 :(得分:0)
通过引用使用主数组foreach
,然后在每行前usort
:
foreach( $array as &$row )
{
usort
(
$row,
function( $a, $b )
{
return strcmp($a['pub_obs'], $b['pub_obs']);
}
);
}
输出:
Array
(
[AC] => Array
(
[0] => Array
(
[pub_id] => 3
[pub_obs] => a
)
[1] => Array
(
[pub_id] => 4
[pub_obs] => c
)
[2] => Array
(
[pub_id] => 1
[pub_obs] => c
)
)
[BA] => Array
(
[0] => Array
(
[pub_id] => 7
[pub_obs] => a
)
[1] => Array
(
[pub_id] => 2
[pub_obs] => b
)
[2] => Array
(
[pub_id] => 1
[pub_obs] => b
)
)
)
使用foreach中的引用usort
函数直接作用于主数组,然后在自定义函数中比较pub_id
键以定义嵌套排序顺序。
根据问题的要求,上述方法有效。但是,如果我们有一个像这样的子数组:
[
[ 'pub_id' => 1, 'pub_obs' => 'b' ],
[ 'pub_id' => 2, 'pub_obs' => 'b' ],
[ 'pub_id' => 3, 'pub_obs' => 'a' ]
]
输出是:
Array
(
[0] => Array
(
[pub_id] => 3
[pub_obs] => a
)
[1] => Array
(
[pub_id] => 2
[pub_obs] => b
)
[2] => Array
(
[pub_id] => 1
[pub_obs] => b
)
)
请求的密钥已正确排序,但是 - 在相同的pub_obs
值 - pub_id
订单上未进行维护。
为避免这种情况,您必须对pub_id
键进行子处理:
usort
(
$row,
function( $a, $b )
{
$mainCmp = strcmp( $a['pub_obs'], $b['pub_obs'] );
if( !$mainCmp )
{
return( strcmp( $a['pub_id'], $b['pub_id'] ) );
}
else return $mainCmp;
}
);
只需使用上述匿名函数的相同内容定义自定义函数:
function myCompare( $a, $b )
{
$mainCmp = strcmp( $a['pub_obs'], $b['pub_obs'] );
if( !$mainCmp )
{
return( strcmp( $a['pub_id'], $b['pub_id'] ) );
}
else
return $mainCmp;
}
然后在foreach()
循环中调用它:
foreach( $array as &$row )
{
usort( $row, 'myCompare' );
}
的 demo 强>
PS:感谢@deceze之前的编辑(在这里维护)。
答案 1 :(得分:-1)
您可以使用此答案中的aasort: Sort Multi-dimensional Array by Value 并将其应用于每个数组行:
1. A List that contain Node name
2. A Forcelayout graph with Node and Link