Сортировка по концу строки php

263
11 декабря 2017, 16:45

Привет. Есть поле в которое вводится данные вида:

23123123 ыаыаыава XXX-1.3.2/14-2
23123121231233 ыаыафывфыава XXX-1.2.2/12-3
23112323123 ыаыаыававфыв XXX-2.1.2/12-15

и так далее. Количество пробелом между тремя частями строки РАЗНОЕ.

Эти данные сохраняются в файл на сервере, затем выводятся в упорядоченной форме (сортированной). Обычная сортировка упорядочивает строки по первым символом, а мне требуется вывести отсортированные по третьей части (XXX-1.2.2/12-3). Может кто подсказать, как?

Answer 1

Христоматийно: uasort

$array = array(
    "23123123 ыаыаыава XXX-1.3.2/14-2",
    "23123121231233 ыаыафывфыава XXX-1.2.2/12-3",
    "23112323123 ыаыаыававфыв XXX-2.1.2/12-15"
);
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    $a_cmp = substr($a, strrpos($a, 'XXX'));
    $b_cmp = substr($b, strrpos($b, 'XXX'));
    return ($a_cmp < $b_cmp) ? -1 : 1;
}
uasort($array, 'cmp');
echo "<pre>" , print_r($array) , "</pre>";
/*
output:
Array
(
    [1] => 23123121231233 ыаыафывфыава XXX-1.2.2/12-3
    [0] => 23123123 ыаыаыава XXX-1.3.2/14-2
    [2] => 23112323123 ыаыаыававфыв XXX-2.1.2/12-15
)
1
*/

UPD Как это работает:

Функция uasort принимает два параметра. Первый - это массив, элементы которого необходимо сортировать. Второй - пользовательская функция, которая циклично (магия) принимает в качестве аргументов по два элемента массива function cmp($a, $b) {, и сравнивает их return ($a < $b) ? -1 : 1;. В данном конкретном случае мы перед сравнением выделяем последнюю часть строк XXX-1.3.2/14-2 и т.д. элементов с помощью функции strpos

$a_cmp = substr($a, strrpos($a, 'XXX'));
$b_cmp = substr($b, strrpos($b, 'XXX'));

и сравниваем уже только их.

return ($a_cmp < $b_cmp) ? -1 : 1;
// если левое меньше правого, вернуть первым левое ( -1 )
// иначе вернуть первое левое вторым ( 1 )

Кроме uasort() есть функция usort(). Делает то же самое с тем отличием, что не сохраняет ключи массива.

uasort output:
Array
(
    [1] => 23123121231233 ыаыафывфыава XXX-1.2.2/12-3
    [0] => 23123123 ыаыаыава XXX-1.3.2/14-2
    [2] => 23112323123 ыаыаыававфыв XXX-2.1.2/12-15
)
usort output:
Array
(
    [0] => 23123121231233 ыаыафывфыава XXX-1.2.2/12-3
    [1] => 23123123 ыаыаыава XXX-1.3.2/14-2
    [2] => 23112323123 ыаыаыававфыв XXX-2.1.2/12-15
)
Answer 2

Целостность данных ваших я не знаю, но самое простое решение примерно такое:

<?php
$input=array(
    "23123123 ыаыаыава XXX-1.3.2/14-2",
    "23123121231233 ыаыафывфыава XXX-1.2.2/12-3",
    "23112323123 ыаыаыававфыв XXX-2.1.2/12-15"
);
//get new array
$output=array();
foreach($input as $string){
    $strArray=explode(" ",$string);
    $key=$strArray[count($strArray)-1];
    $output[$key]=$string;
}
ksort($output);
//check new array
var_dump($output);

P.S. Может кто-то знает более компактное/быстрое/правильное решение?

Answer 3

Обьеденю два ответа

array = array(
  "23123123 ыаыаыава XXX-1.3.2/14-2",
  "23123121231233 ыаыафывфыава XXX-1.2.2/12-3",
  "23112323123 ыаыаыававфыв XXX-2.1.2/12-15"
);
function cmp($a, $b) {
  if ($a == $b)
    return 0;
  $a_cmp = explode(" ", $a);
  $a_cmp = $a_cmp[2];
  $b_cmp = explode(" ", $b);
  $b_cmp = $b_cmp[2];
  if ($a_cmp == $b_cmp)
    return 0;
  return ($a_cmp < $b_cmp) ? -1 : 1;
}
uasort($array, 'cmp');
echo "<pre>" , print_r($array) , "</pre>";
READ ALSO
Почему все объекты не выводятся из for в if?

Почему все объекты не выводятся из for в if?

В if выводит только один объект из [0] с совпадением из БД [кинопоиск_ид] А мне нужно, чтобы они выводили некоторые обьекты с совпадением, как...

253
Записать математическую формулу на PHP

Записать математическую формулу на PHP

Доброго времени суток! Нужна ваша помощьНеобходимо записать математическую формулу на PHP

193