У меня есть массив, как так:
[0] => /home/user/public_html/things/1 - First thing/
[1] => /home/user/public_html/things/3 - Third thing/
[2] => /home/user/public_html/things/2 - Second thing/
Какой простой способ отсортировать этот массив, чтобы 'things'
идти 1, 2, 3?
Я использовал natsort()
только на последнем фрагменте пути, но он не совсем прост в использовании … Я отрубил оставшуюся часть пути, отсортировал, затем снова включил его, но это некрасиво и может измениться в это время, поэтому я надеюсь на лучший способ, чем это.
Буду признателен за любые предложения, я уверен, что есть несколько способов подойти к этому 🙂
Принимая ваш вопрос как есть (сортировать массив путей на основе определенного фрагмента пути), Я подумал о функции, которая позволит вам указать фрагмент, по которому вы хотите отсортировать пути.
Поскольку пути в примере отличаются только в последней части, приведенное выше не очень интересно, если применять его в этом примере. Поэтому я буду использовать немного другой список:
$paths = [
'/home/user/public_html/things/sub/1',
'/home/user/public_html/things/3',
'/home/admin/public_html/things/2'
];
function build_sorter($part) {
return function ($a, $b) use ($part) {
return strnatcmp(
implode("/", array_slice(explode("/", $a), $part)),
implode("/", array_slice(explode("/", $b), $part))
);
};
}
// sort by second part in paths:
usort($paths, build_sorter(2));
print_r ($paths);
Сгенерированный вывод поместил папку «admin» первым:
Array (
[0] => /home/admin/public_html/things/2
[1] => /home/user/public_html/things/3
[2] => /home/user/public_html/things/sub/1
)
Сортировка по последней части будет выглядеть так:
usort($paths, build_sorter(-1));
print_r ($paths);
Выход:
Array (
[0] => /home/user/public_html/things/sub/1
[1] => /home/admin/public_html/things/2
[2] => /home/user/public_html/things/3
)
Таким образом, аргумент, который вы передаете builder_sort
это смещение (положительное слева, отрицательное справа) части путей, на которых вы хотите основать свой вид.
применение asort функция может сделать это.
$p = [
'/home/user/public_html/things/1',
'/home/user/public_html/things/3',
'/home/user/public_html/things/2'
];
asort($p);
print_r($p);
Я такой подход
$paths = [
'/home/user/public_html/things/1 - First thing/',
'/home/user/public_html/things/3 - Third thing/',
'/home/user/public_html/things/2 - Second thing/'
];
$matches = [];
$sorted_paths = [];
foreach ($paths as $path) {
if (preg_match('/(\d+)/', $path, $matches)) {
$sorted_paths[$matches[1]] = $path;
}
}
ksort($sorted_paths);
print_r($sorted_paths);
В результате я получил что-то вроде этого:
Array
(
[1] => /home/user/public_html/things/1 - First thing/
[2] => /home/user/public_html/things/2 - Second thing/
[3] => /home/user/public_html/things/3 - Third thing/
)
Из того, что я понимаю, вы хотите отсортировать результаты массива по номеру после папки с вещами.
<?php
$Directories = array('/home/user/public_html/things/1', '/home/user/public_html/things/3', '/home/user/public_html/things/2');
$SortedNums = array();
foreach ( $Directories as $Dir )
{
$Nums = explode("/", $Dir);
foreach ( $Nums as $Num )
{
if ( is_numeric($Num) )
{
array_push($SortedNums, $Num);
}
}
}
sort($SortedNums);
$ArrayLength=count($SortedNums);
for($x=0;$x<$ArrayLength;$x++)
{
echo $SortedNums[$x];
echo "<br>";
}
?>
Производит следующий вывод:
1
2
3