在 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);
我是这样处理的:
- 找到路径中的第一个整数
- 将找到的 int 值定义为新数组中当前路径的键
- 使用 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
的参数是您要作为排序依据的那部分路径的偏移量(从左开始为正,从右开始为负)。
我有一个这样的数组:
[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);
我是这样处理的:
- 找到路径中的第一个整数
- 将找到的 int 值定义为新数组中当前路径的键
- 使用 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
的参数是您要作为排序依据的那部分路径的偏移量(从左开始为正,从右开始为负)。