【问题标题】:PHP sorting arrays numerically by key valuePHP按键值对数组进行数字排序
【发布时间】:2010-09-21 13:42:57
【问题描述】:

我正在尝试根据第一个键中的值按数字顺序对几个数组进行排序:

$array1[0] = '1';
$array1[1] = 'content';
$array1[2] = 'more content';

$array3[0] = '3';
$array3[1] = 'content';
$array3[2] = 'more content';

$array4[0] = '4';
$array4[1] = 'content';
$array4[2] = 'more content';

$array2[0] = '2';
$array2[1] = 'content';
$array2[2] = 'more content';

$arrays = array($array1, $array3, $array4, $array2);

foreach ($arrays as $array) {

echo $array[0] . ' ' . $array[1] . ' ' . $array[2] . '<br>';

}

以“1、3、4、2”的顺序输出数组,我需要它们这样输出:“1、2、3、4”。不知道如何甚至是否在此处使用 ksort/asort/array_multisort 函数。

【问题讨论】:

  • 自从我进行任何 PHP 编码以来已经有一段时间了,但这看起来像是 asort 的情况,因为它将根据值对其进行排序。把它通过asort然后显示数组...

标签: php arrays key


【解决方案1】:

您将需要一个自定义比较函数,然后您可以将其与usort 或uasort 一起使用:

function cmp($a, $b) {
    return intval($a[0]) - intval($b[0]);
}
usort($arrays, 'cmp');

从 PHP 5.3 开始,您还可以使用 anonymous function 进行比较功能:

usort($arrays, function($a, $b) { return intval($a[0]) - intval($b[0]); });

您也可以使用array_multisort,创建一个首先要排序的键数组,然后使用它对数组项本身进行排序:

$keys = array();
foreach ($arrays as $array) $keys[] = intval($array[0]);
array_multisort($keys, $arrays);

这样做可以防止为每对比较的值调用比较函数,因为只比较键值。

【讨论】:

  • 我认为因为数组的第一个索引被指定为字符串,所以首先在值上使用 intval() 可能更安全,否则它可能会进行字符串比较?
  • @acqu13sce:是的,你是对的。字符串比较可能会产生意想不到的结果,例如"2" &gt; "12".
  • 哈哈,这比我想象的要复杂。我喜欢 array_multisort 方法,之前从未使用过它,所以你能为我再充实一点,主要是输出方面吗?并且是设计在 foreach 语句之后省略 { 吗?
  • 实际上,没关系,我使用 usort 代替了它。谢谢!
【解决方案2】:

使用 usort 您可以在数组上指定自己的排序标准。这是关于如何实现您的要求的想法

function cmp($a, $b)
{
  if ($a == $b) {
      return 0;
  }
  return (intval($a[0]) < intval($b[0])) ? -1 : 1;
}

usort($arrays, "cmp");

【讨论】:

    猜你喜欢
    • 2016-04-17
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多