Вопрос сортировки массива для системы новостей - PullRequest
0 голосов
/ 28 декабря 2010

В данный момент я пытаюсь понять, как сортировать файлы массива.У меня есть простая система публикации новостей, которая хранит контент в отдельных .dat файлах, а затем сохраняет их в массиве.Я пронумеровал файлы, чтобы мой массив мог отсортировать их от наименьшего числа к наибольшему;Однако я столкнулся с небольшой проблемой.Для начала приведу еще немного информации о моей системе, чтобы вы могли ее лучше понять.

Функция, которая собирает мои файлы:

function getNewsList() {
        $fileList = array();
        // Open the actual directory
        if($handle = opendir(ABSPATH . ADMIN . "data")) {
            // Read all file from the actual directory
            while($file = readdir($handle))  {
                if(!is_dir($file)) {
                    $fileList[] = $file;
                }
            }
        }
        // Return the array.
        return $fileList;
    }

В отдельном файле находится программа, которая обрабатываетновостной пост.Я не опубликовал этот код для простоты, но я объясню, как называются файлы.Файлы нумеруются, и часть заголовка сообщения используется ... для нумерации я получаю счетчик массива и добавляю «1» в качестве смещения.Я получаю название поста, кодирую его, чтобы сделать его удобным для имени файла, и ограничиваю объем текста, поэтому к концу всего этого получаю:

// Make the variable that names the file that will contain
  // the post.
  $filename = "00{$newnumrows}_{$snipEncode}";

При запуске print_r на вышеупомянутой функции я получаю:

Array (
     [0] => 0010_Mira_mi_Soledad.dat
     [1] => 0011_WOah.dat
     [2] => 0012_Sinep.dat
     [3] => 0013_Living_in_Warfa.dat
     [4] => 0014_Hello.dat
     [5] => 001_AS.dat
     [6] => 002_ASASA.dat
     [7] => 003_SSASAS.dat
     ...
     [13] => 009_ASADADASADAFDAF.dat
)

И вот как отображается мой контент.Почему-то согласно массиву сортировка 0010 идет раньше 001 ...?Есть ли способ, которым я могу получить свой массив для сортировки 001 до 0010 ?

Ответы [ 3 ]

2 голосов
/ 28 декабря 2010

Вы можете использовать функцию php natcasesort (array), которая будет сортировать массив с помощью алгоритма «естественного порядка», и вы получите желаемый результат

НТН.

: Малайский

1 голос
/ 28 декабря 2010

Проблема с подчеркиванием. Всегда числовые символы сортируются перед подчеркиванием.

Посмотрите, получите ли вы желаемый результат, используя sort($your_array, SORT_NUMERIC).

Для получения дополнительной информации см. Руководство по PHP для сортировки

Вы также можете использовать natcasesort() (как предложил малайский) или natsort(). Но оба поддерживают связь индекса.

1 голос
/ 28 декабря 2010

Возьмите имя файла и извлеките номер префикса как целое число:

// $filename has the format: "00{$newnumrows}_{$snipEncode}"
function generateSortKey($filename)
{
    $separatorPos = stripos($filename, '_');

    $prefix = trim(substr($filename, 0, $separatorPos));
    return intval($prefix);
}

После создания ассоциативного массива из списка файлов ключи будут использоваться в качестве значения для сортировки позже:

function toSortableArray($files)
{
    $result = array();

    foreach ($files as $filename)
    {
        $key = generateSortKey($filename);
        $value = $filename;

        $result[$key] = $value;
    }

    return $result;
}

и при последнем использовании krsort () :

$list = getNewsList();
$sortableList = toSortableArray($list);

krsort($sortableList);   // after that $sortableList is
                         // sorted by key in descending order now

ИСПРАВЛЕНИЕ: ksort () => krsort ()

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