PHP - сортировать массив по дате - не первый элемент

Чтение из плоского файла... Мне нужно отобразить элементы массива, отсортированные по дате в порядке убывания (= самая текущая дата отображается первой).

Не уверен... Есть ли способ просто отсортировать данные по элементу [1] или мне нужно поместить эти данные во второй массив, а затем отсортировать этот массив... или??

Затем... ПОЖАЛУЙСТА, включите раздел печати... переменные, необходимые для вывода данных. Спасибо.

(*Да, я видел несколько других примеров этого в «стеке». Однако мне не удалось правильно вывести значения при использовании «сравнения».)

НЕОБРАБОТАННЫЕ ДАННЫЕ:
да|2012-12-12|Джим Нет
да|2013-06-04|Джо Смит
нет|2013-04-21| Джейн Доу

СОРТИРОВКА ДАННЫХ:
да|2013-06-04|Джо Смит
нет|2013-04-21|Джейн Доу
да|2012-12-12| Джим Ноун

while (!feof($file) ) {
    $lines = fgets($file);
    $ele = explode('|', $lines);

    $db_display = $ele[0];
    $db_date = $ele[1];
    $db_name = $ele[2];

    $db_name = substr_replace($db_name,"",-1); // trim last char

    echo '<td>'.$db_name.'</td><td>'.$db_date.'</td>';
}

person mar2195    schedule 07.06.2013    source источник
comment
Просто вытащите эту первую дату из массива и отсортируйте остальные...   -  person sashkello    schedule 07.06.2013
comment
используйте array_shift, чтобы получить первую строку массива, а затем отсортируйте ее.   -  person bksi    schedule 07.06.2013
comment
Используйте usort() с функцией сравнения, которая сравнивает элемент 1 двух аргументов.   -  person Barmar    schedule 07.06.2013


Ответы (1)


Это должно привести вас туда...

Предполагая, что вы получаете имя файла $infile

$fp = fopen($infile, "w");
$data = array();
while ($rec = fgetcsv($fp, 2048, "|")){
         $data[] = $rec;
}


usort($data, function ($a, $b){
     // if you want to reverse the sort swap a for b
     return strtotime($b[1]) - strtotime($a[1]);
});



foreach($data as $v){
   echo implode("|", $v)."\n";
}

Выход на стандартный вывод ... вы можете так же легко fopen/fputcsv те же данные.

person Orangepill    schedule 07.06.2013
comment
Спасибо. Вопрос: Не могли бы вы опубликовать раздел WHILE, используя синтаксис кодирования из моего исходного сообщения? (К вашему сведению: $file в моем коде — это ваш $fp) - person mar2195; 07.06.2013
comment
не может использовать ваш цикл, потому что вам нужно накапливать значения перед сортировкой. но обновленный код должен в основном быть заменой того, что вы разместили в ответе. - person Orangepill; 07.06.2013
comment
Ага. Ты прав. Для дальнейшего использования другими, опубликуйте свое первое решение для кодирования. Это тот, который работает. Еще одна вещь ... Как бы я ВЗРЫВАЕТ дату в FOREACH, чтобы разделить дату на MO, DT, YR? - person mar2195; 07.06.2013
comment
Откатился назад... самый простой способ взорваться - list($yr, $mo, $dt) = explode("-", $b[1]); - person Orangepill; 07.06.2013
comment
Извините за вопросы новичка... Куда, черт возьми, мне поместить список/взорвать строку кода? - person mar2195; 07.06.2013
comment
если вы хотите сделать это на выходе, это будет в блоке foreach внизу, который, я думаю, во всех версиях, которые я опубликовал, был $v[1], а не $b[1]; Затем вы можете повторить его там, где это необходимо. Если вы просто хотите отобразить дату в другом формате, вы можете пропустить разделение бизнеса и просто использовать date('F j, Y', strtotime($v[1])); см. здесь для параметров формата. - person Orangepill; 07.06.2013