В php, как мне отсортировать массив путей на основе определенного (в данном случае последнего) фрагмента пути?

У меня есть массив, как так:

[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() только на последнем фрагменте пути, но он не совсем прост в использовании … Я отрубил оставшуюся часть пути, отсортировал, затем снова включил его, но это некрасиво и может измениться в это время, поэтому я надеюсь на лучший способ, чем это.

Буду признателен за любые предложения, я уверен, что есть несколько способов подойти к этому 🙂

1

Решение

Принимая ваш вопрос как есть (сортировать массив путей на основе определенного фрагмента пути), Я подумал о функции, которая позволит вам указать фрагмент, по которому вы хотите отсортировать пути.

Поскольку пути в примере отличаются только в последней части, приведенное выше не очень интересно, если применять его в этом примере. Поэтому я буду использовать немного другой список:

$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 это смещение (положительное слева, отрицательное справа) части путей, на которых вы хотите основать свой вид.

1

Другие решения

применение 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);
0

Я такой подход

  1. найти 1-е целое число в пути
  2. определить найденное значение int как ключ для текущего пути в новом массиве
  3. отсортировать новый массив с помощью ksort ()

$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/
)
0

Из того, что я понимаю, вы хотите отсортировать результаты массива по номеру после папки с вещами.

<?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

0
По вопросам рекламы [email protected]