我正在尝试对这个多维数组进行排序,但没有成功。我需要按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很快! 谢谢你的回答,伙计和所有帮助过的人!
通过引用使用带有主数组的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;
}
);
在 PHP <5.3 中使用此解决方案
只需定义一个与上述匿名函数内容相同的自定义函数:
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' );
}
演示
- 查看更多关于 usort() 的信息
PS:感谢您@deceze之前的编辑(在此处维护)。
您可以使用此答案中的 aasort:按值对多维数组进行排序并将其应用于每个数组行:
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[$ii]=$va[$key];
}
asort($sorter);
foreach ($sorter as $ii => $va) {
$ret[$ii]=$array[$ii];
}
$array=$ret;
}
//Now your array
foreach($array as $key => &$value){
aasort($value,"pub_obs");
}