【问题标题】:Sorting data and print out in alphabetic order排序数据并按字母顺序打印
【发布时间】:2010-04-29 08:33:44
【问题描述】:

我得到了一个数组,其中包含一些这样的数据:

$arrs = Array("ABC_efg", "@@zzAG", "@$abc", "ABC_abc")

我试图以这种方式打印数据(按字母顺序打印):

[字符串以字符 A 开头]
ABC_abc
ABC_efg
[字符串以 A 到 Z 以外的字符开头]
@$abc
@@zzAG

【问题讨论】:

  • 您需要非常明确地了解您想要的确切排序规则。希望有人已经做出了正确的猜测。

标签: php arrays sorting


【解决方案1】:

我假设您的意思是以字母开头的字符串应该出现在所有其他字符串之前,否则所有字符串都应该按标准顺序排序。

您使用usort() 并为排序定义一个自定义函数,并使用ctype_alpha() 来确定某事物是否为字母。

$arrs = Array("ABC_efg", "@@zzAG", "@$abc", "ABC_abc");
usort($arrs, 'order_alpha_first');

function order_alpha_first($a, $b) {
  $lenA = strlen($a);
  $lenB = strlen($b);
  $len = min($lenA, $lenB);
  $i = 0;
  while ($a[$i] == $b[$i] && $i < $len) {
    $i++;
  }
  if ($i == $len) {
    if ($lenA == $lenB) {
      return 0; // they're the same
    } else {
      return $lenA < $lenB ? -1 : 1;
    }
  } else if (ctype_alpha($a[$i])) {
    return ctype_alpha($b[$i]) ? strcmp($a[$i], $b[$i]) : -1;
  } else {
    return ctype_alpha($b[$i]) ? 1 : strcmp($a[$i], $b[$i]);
  }
}

输出:

Array
(
    [0] => ABC_abc
    [1] => ABC_efg
    [2] => @$abc
    [3] => @@zzAG
)

【讨论】:

    【解决方案2】:

    您编写了一个函数sortArray($array, $preset=1),将$array 拆分为两个数组。 ($preset 默认为空)

    第一个数组包含所有不以特殊符号开头的元素,第二个数组包含所有以特殊符号开头的元素。您比正常排序 firstArray (sort()) 并打印它们,然后调用第二个数组上的函数,传递预设。

    (类似

    if ($array[i][$preset] != "@") {
    array_push ($firstArray ,$array[i]);
    } else {
    array_push ($secondArray ,$array[i]);
    }
    sort($firstArray);
    print($firstArray);
    sortArray($secondArray, $preset++);
    

    )

    这就是我想到的:)

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多