在 php 中,如何根据特定(在本例中为最后一个)路径片段对路径数组进行排序?

In php, how do I sort an array of paths based on a specific (in this case the last) path-fragment?

我有一个这样的数组:

[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(),但事实证明它并不易于使用...我将路径的其余部分切掉,排序,然后放回去,但这很丑陋同时它可能会发生变化,所以我希望有比这更好的方法。

我们将不胜感激任何和所有的建议,我相信有几种方法可以解决这个问题:)

应用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);

我是这样处理的:

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

根据我的理解,您想按文件夹后的数字对数组结果进行排序。

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

考虑到你的问题(根据特定路径片段对路径数组进行排序),我想到了一个函数,可以让你指定片段希望对路径进行排序。

由于示例中的路径仅在最后一部分有所不同,因此将上述内容应用于该示例时并不是很有趣。所以我将使用一个稍微不同的列表:

$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 的参数是您要作为排序依据的那部分路径的偏移量(从左开始为正,从右开始为负)。