如何检查数组是否已在php中排序

时间:2013-01-11 11:00:28

标签: php arrays

我在php中有一个小任务。我有一个简单的数组。

Array
(
    [0] => 50
    [1] => 100
    [2] => 150

)

是否有一个PHP内置函数,我可以使用它,它可以返回true或false,因此如果数组已经排序或没有,或任何其他PHP脚本,没有循环。我知道循环和条件很容易。

10 个答案:

答案 0 :(得分:5)

如果输入数组相等,则可以将它们与已排序的数组进行比较。

$input  = array(50, 100, 150);
$sorted = array_values($input);
sort($sorted);

if ( $input === $sorted ) {
  // input array was already sorted
}

答案 1 :(得分:4)

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)

答案 2 :(得分:2)

由于如果数组是否排序,PHP不保持状态,因此无法知道。唯一的其他解决方案是迭代数组。

答案 3 :(得分:2)

您可以使用array_reduce将每个元素与下一个元素进行比较,如果数组未排序则抛出异常。

答案 4 :(得分:1)

在这里,您可以尝试使用以下代码:

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

答案 5 :(得分:0)

您可以将它与已排序的数组进行比较,或者如果数组来自数据库,您可以使用order by通过SQL查询来控制它,在php中没有内置函数来检查它。

答案 6 :(得分:0)

这无论在键上都可以使用:

$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;
}

答案 7 :(得分:0)

我很惊讶没有人建议实际检查输入数组本身。 也许这是我的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;
}

P.S。我知道OP没有循环,但由于没有好的解决方案,我决定发布任何人都可以复制粘贴到他的项目的代码。

答案 8 :(得分:0)

阵列无法知道它们被分类的天气,因为有这么多的排序。只是对于数字,可以有升序,降序,绝对升序,绝对......你得到了图片。 但是,检查数组是否已排序的算法与排序顺序无关

以下是IF EXISTS ( SELECT 1 FROM sysobjects WHERE type = 'U' AND name = 'test' ) drop table test GO 函数,如果给定isSorted将检查数组的元素是否按该顺序排序。这样comparator不知道正在测试的订单,而是将其委托给isSorted

由于问题按特定顺序显示数字,因此我还根据php comparator提供了comparator升序。

<

答案 9 :(得分:0)

我看到许多答案正在执行完整数组排序,然后将整个原始副本与整个排序副本进行比较。当然,这没有效率那么高。要检查数组是否已排序,您无需复制,变异或对其进行排序-只需对其进行迭代并进行比较即可。早于break / return的脚本将完成绝对的最小工作。

(我也看到了几个答案,叫array_values(),但我不明白为什么重新编制索引很有价值。)

例如:(Demo of a true and a false outcome

$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以外的语言。