私はphpで小さな仕事をしています。単純な配列があります。
Array
(
[0] => 50
[1] => 100
[2] => 150
)
配列がすでにソートされているかどうかに応じて、trueまたはfalseを返すことができるように使用できるphp組み込み関数、またはこのための他の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以外の言語を使用することをお勧めします。