我有很多条路要分类.
Array
(
/something/foo1
/something/special/foo2
/something/foo3
/something/special/foo4
/something/foo5
/something/special/foo6
)..。因此,所有包含/special/的路径都在数组的末尾结束,如下所示:
Array
(
/something/foo1
/something/foo3
/something/foo5
/something/special/foo2
/something/special/foo4
/something/special/foo6
)路径的原始排序必须保持不变(因此1,2,3,4,5,6 => 1,3,5,2,4,6)。有什么优雅的方法吗?这能用usort函数来实现吗?
发布于 2015-02-21 02:49:49
您可以使用unset并附加[],如下所示
$x = array(1,2,3);
$x[] = $x[1];
unset($x[1]);
print_r($x);
Array
(
[0] => 1
[2] => 3
[3] => 2
)这样,您就可以遍历数组,测试每个元素,并将包含模式的元素翻转到末尾。
$len = count($a);
for ($i=0; $i<$len; $i++) {
if (...) {
$a[] = $a[i];
unset($a[i]);
}
}编辑:php的数组同时是列表、散列和数组。可以在保留其索引的同时将元素移到末尾!例如
$a = array(1,2,3);
$t = $a[1];
unset($a[1]);
$a[1] = $t;
print_r($a);
Array
(
[0] => 1
[2] => 3
[1] => 2
)发布于 2015-02-21 02:54:34
在您的特定示例中,您可以简单地使用asort($array);
但那是假设foo永远是foo。
输出:
array(6) {
[0]=>
string(15) "/something/foo1"
[2]=>
string(15) "/something/foo3"
[4]=>
string(15) "/something/foo5"
[1]=>
string(23) "/something/special/foo2"
[3]=>
string(23) "/something/special/foo4"
[5]=>
string(23) "/something/special/foo6"
}如果不是这样的话,让我知道,我会做点别的
..。下面是新方法ref注释:
$array = array(
'/something/zoo',
'/something/special/foo',
'/something/loo',
'/something/special/goo',
'/something/boo',
'/something/special/poo'
);
uasort($array, function($a, $b) {
$specialInA = strpos($a, '/special/') !== false;
$specialInB = strpos($b, '/special/') !== false;
if ($specialInA > $specialInB) {
return 1;
}
if ($specialInB > $specialInA) {
return -1;
}
return $a > $b;
});输出:
array(6) {
[4]=>
string(14) "/something/boo"
[2]=>
string(14) "/something/loo"
[0]=>
string(14) "/something/zoo"
[1]=>
string(22) "/something/special/foo"
[3]=>
string(22) "/something/special/goo"
[5]=>
string(22) "/something/special/poo"
}可能会写得更好,但应该有效
https://stackoverflow.com/questions/28641491
复制相似问题