我在 php 中有一个小任务。我有一个简单的数组。
Array
(
[0] => 50
[1] => 100
[2] => 150
)
是否有一个我可以使用的 php 内置函数,以便它可以返回 true 或 false,因此如果数组已经排序,或者任何其他 php 脚本,没有循环。我知道循环和条件很容易。
如果它们相等,您可以将输入数组与已排序的数组进行比较。
$input = array(50, 100, 150);
$sorted = array_values($input);
sort($sorted);
if ( $input === $sorted ) {
// input array was already sorted
}
function arraySorted($array) {
$a = $array;
$b = $array;
sort($b);
if ($a == $b){
return true;
} else {
return false;
}
}
//test for [0],[3],[2]
$input = array(0 => 250,
3 => 100,
2 => 150);
var_dump($input);
echo "<br />";
//array(3) { [0]=> int(250) [3]=> int(100) [2]=> int(150) }
var_dump(arraySorted($input));
echo "<br />";
//bool(false)
//test for [0],[1],[2]
$input = array(0 => 250,
1 => 100,
2 => 150);
var_dump($input);
echo "<br />";
//array(3) { [0]=> int(250) [1]=> int(100) [2]=> int(150) }
var_dump(arraySorted($input));
echo "<br />";
//bool(false)
//test for [0],[3],[2] and asc values
$input = array(0 => 50,
1 => 100,
2 => 150);
var_dump($input);
echo "<br />";
//array(3) { [0]=> int(50) [1]=> int(100) [2]=> int(150) }
var_dump(arraySorted($input));
echo "<br />";
//bool(true)
由于 PHP 不保存数组是否已排序的状态,因此它无法知道。唯一的其他解决方案是遍历数组。
您可以使用array_reduce
将每个元素与下一个元素进行比较,如果数组未排序,则引发异常。
在这里,您可以尝试使用以下代码:
<?php
$sort = array(
0 => 50,
1 => 100,
2 => 150
);
$default = $sort;
sort($sort);
$flag = true;
foreach($sort as $key=>$value)
if($value!=$default[$key])
$flag = false;
if($flag)
echo "Already sorted";
else
echo "Not Already sorted";
?>
我很惊讶没有人提议实际检查输入数组本身。也许这是我的 C++ 背景,但我不能不关心算法的复杂性,坦率地说,复制和排序数组只是愚蠢的。
namespace Util\Functions;
function compare($lhs, $rhs, $descendingOrder = false)
{
$result = 0;
if ($lhs < $rhs) {
$result = -1;
} else if ($lhs > $rhs) {
$result = 1;
}
if ($descendingOrder) {
$result *= -1;
}
return $result;
}
function isSorted(array $arr, callable $compareFunction = null)
{
$count = count($arr);
if ($count < 2){
return true;
}
if ($compareFunction === null) {
$compareFunction = 'Util\Functions\compare';
}
for ($i = 1; $i < $count; $i++) {
if ($compareFunction($arr[$i - 1], $arr[$i]) > 0) {
return false;
}
}
return true;
}
PS我知道OP没有要求循环,但由于没有好的解决方案,我决定发布任何人都可以复制粘贴到他的项目的代码。
您可以将它与已经排序的数组进行比较,或者您可以通过 SQL 查询来控制它,order by
如果数组来自数据库,则在 php 中没有内置函数来检查这一点。
无论键如何,这都将起作用:
$a = array(5 => 'aple', 3 => 'banana', 1 =>'citron');
$b = array(2 => 'orange', 1 => 'wine', 5 => 'apple');
echo arraySorted($a) ? "sorted" : 'not';
echo "\n";
echo arraySorted($b) ? "sorted" : 'not';
function arraySorted($array) {
$sorted = $vals = array_values($array);
sort($sorted);
return $sorted === $vals;
}
数组无法知道它们被排序的天气,因为有太多的排序。只是对于数字,可以有升序、降序、绝对升序、绝对......你明白了。但是,检查数组是否已排序的算法与排序顺序无关。
接下来是isSorted
函数,如果给定comparator
将检查数组元素是否按该顺序排序。这种方式isSorted
不知道正在测试什么订单,而是将其委托给comparator
.
由于问题以特定顺序显示数字,因此我还提供comparator
了基于 php 的升序<
。
$xs = [
50,
100,
150
];
// Here is example of comparator, it have to take 2 elements, and return boolean signaling weather relationship you want to test holds true
$comparator = function($current, $next) {
return $current < $next;
};
function isSorted($xs, $comparator){
$answer = true;
foreach ($xs as $key => $current) {
if(!isset($xs[$key + 1]))
continue;
$next = $xs[$key + 1];
$answer = $answer && $comparator($current, $next);
}
return $answer;
}
我看到很多答案都在执行完整的数组排序,然后将整个原始文件与整个排序的副本进行比较。当然,这并不像它可能的那样有效。要检查数组是否已排序,您无需复制它、对其进行变异或排序——只需对其进行迭代并随时进行比较。带有早期break
/的脚本return
将完成绝对最少的工作。
(我也看到几个答案打电话array_values()
,但我不明白为什么重新索引很有价值。)
例如:(真假结果的演示)
$array = [50, 50, 100, 175]; // no break
$last = reset($array);
$isSorted = true;
foreach ($array as $value) {
if ($last > $value) {
$isSorted = false;
break;
}
$last = $value;
}
var_export($isSorted); //true
只有当数组完全排序或最终元素未排序时,这才会完整运行您的数据。
但实际上,如果您关心数组是否已排序,您可能只需对其进行排序并继续编写脚本即可。
如果您需要一些能够执行超快速评估的东西,因为您正在处理大量数据,那么您可能想要使用 php 之外的语言。