Сортировка данных и распечатка в алфавитном порядке - PullRequest
0 голосов
/ 29 апреля 2010

Я получил массив, который содержит некоторые данные, подобные этому:

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

Я пытался распечатать данные таким образом (Печать в алфавитном порядке):

[Строка начинается с символа A]
ABC_abc
ABC_efg
[Строка начинается с символа, отличного от A до Z]
@ $ А
@@ zzAG

Ответы [ 2 ]

3 голосов
/ 29 апреля 2010

Я предполагаю, что вы имеете в виду, что строки, начинающиеся с буквы, должны появиться до того, как все остальные строки будут отсортированы в обычном порядке.

Вы используете 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
)
0 голосов
/ 29 апреля 2010

Вы пишете функцию sortArray($array, $preset=1), которая разбивает массив $ на два массива. ($ 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++);

)

Это только то, что пришло мне в голову:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...