В php как я могу отсортировать массив строк по дате, когда каждая строка содержит как дату, так и дополнительный текст? - PullRequest
0 голосов
/ 04 мая 2020

Это мой php контент массива, который я хочу отсортировать в порядке убывания даты. Каждая строка начинается с даты. В каждой строке будет более одного слова:

$newarray = [
    "8-06-2001 fish",
    "10-09-2020 chips",
    "3-07-2020 peas",
    "9-09-2005 chicken",
    "5-05-1999 veg",
    "20-04-1998 sausage",
    "1-04-1998 haddock",
    "7-04-1998 cod",
    "3-04-1998 curry",
    "7-09-2005 burger",
    "1-09-2005 cheese"
];

Я пробовал эту функцию, но она не подходит для текста и даты:

// DATE SORT FUNCTION
$compare_function = function($a,$b) {$a_timestamp = strtotime($a); // convert string date to a int timestamp
$b_timestamp = strtotime($b); 
if ($a_timestamp > $b_timestamp) {return -1;}
elseif ($a_timestamp < $b_timestamp) {return 1;} else {return 0;}};

// USE FUNCTION
usort($newarray, $compare_function)

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Проблема в strtotime вернет false, если вы передадите ей строку, не относящуюся к дате. "8-06-2001 fish" не является строкой даты и времени, так как "fi sh" не является датой или временем. Таким образом, все ваши strtotime вызовы возвращают false, и ваш сортировка не работает.

Чтобы извлечь строку даты из ваших строк, вам нужно разделить строки, чтобы вы только получил вашу строку даты. Символ, который разделяет вашу строку даты, а остальные (т. Е. Символ, который разделяет "8-06-2001" и "fish") - это " ".

Итак, вам нужно разделить вашу строку на " ". Для этого используйте explode(" ", $string), который возвращает массив. Первый элемент в этом массиве (то есть [0]) - это строка перед первым " ".

Вот код, который должен быть:

    // DATE SORT FUNCTION
    $compare_function = function($a,$b) {
        $a_timestamp = strtotime(explode(" ", $a)[0]); // convert string date to a int timestamp
        $b_timestamp = strtotime(explode(" ", $b)[0]);
        if ($a_timestamp > $b_timestamp) {return -1;}
        elseif ($a_timestamp < $b_timestamp) {return 1;} else {return 0;}
    };

    // USE FUNCTION
    usort($newarray, $compare_function)
0 голосов
/ 04 мая 2020

strtotime не возвращает целое число, если в строке есть фрагмент времени. Попробуйте вместо

strtotime(current(explode(' ', $a)))

. Это разбивает строку на пробелы, берет первый кусок и просто делает strtotime на этом.

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