PHP按字段名对多维数组进行排序

3

我尝试修改这段代码,以便使用它来对一个具有命名键/字段的多维数组进行排序。该字段是一个整数,我需要按从小到大的顺序进行排序。

function myCmp($a, $b)
{
    return strcmp($a["days"], $b["days"]);
}

uasort($myArray, "myCmp");

这样排序可以满足我的需求,但是顺序不对。目前它按从大到小的顺序排序,而不是使用自然顺序。我需要按照自然顺序从小到大排序(例如,2排在5、12和24之前)。

3个回答

7

strnatcmp()是你的好朋友

例如(使用PHP 5.3闭包/匿名函数):

<?php
$myArray = array( 'foo'=>array('days'=>2), 'bar'=>array('days'=>22), 'ham'=>array('days'=>5), 'egg'=>array('days'=>12) );
uasort($myArray, function($a, $b) { return strnatcmp($a["days"], $b["days"]); });

foreach($myArray as $k=>$v) {
  echo $k, '=>', $v['days'], "\n";
}

打印

foo=>2
ham=>5
egg=>12
bar=>22

1
你可以简单地颠倒 strcmp 的参数:
function myCmp($a, $b)
{
  return strcmp($b["days"], $a["days"]);
}

uasort($myArray, "myCmp");

1

由于您想按自然顺序排序,因此您不应该使用 strcmp,而应该使用以下方法:

function myCmp($a, $b)
{
  if ($a['days'] == $b['days']) return 0;
  return ($b['days'] > $a['days']) ? -1 : 1;
}

这里有一个工作示例

如果还有人在关注,这不会返回自然顺序。对于数字 27、2、5,它返回的是 5、27、2。 - YsoL8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接