Привет. Есть поле в которое вводится данные вида:
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
). Может кто подсказать, как?
Христоматийно: 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
)
Целостность данных ваших я не знаю, но самое простое решение примерно такое:
<?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. Может кто-то знает более компактное/быстрое/правильное решение?
Обьеденю два ответа
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>";
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В if выводит только один объект из [0] с совпадением из БД [кинопоиск_ид] А мне нужно, чтобы они выводили некоторые обьекты с совпадением, как...
Доброго времени суток! Нужна ваша помощьНеобходимо записать математическую формулу на PHP