我有一个二维数组,其中包含必须使用以下规则验证的数字范围,范围应从0开始,然后按算术级数进行。
例如:
$array = array();
$array[] = array(0);//VALID
$array[] = array(0,1,2,3,4,5);//VALID
$array[] = array("0","1");//VALID
$array[] = array(0,1,3,4,5,6);//WRONG
$array[] = array(1,2,3,4,5);//WRONG
$array[] = array(0,0,1,2,3,4);//WRONG
在php中最有效的方法是什么?
更新 我忘了添加数字可以表示为字符串
答案 0 :(得分:9)
将其与range($firstelt, $lastelt)
进行比较?
function isProgression($arr){
return $arr == range(0, $arr[count($arr)-1]);
}
完全随意的基准:
function isProgression($array){
return ($array == range(0, $array[sizeof($array)-1]));
}
function isProgression2($array){
$count = count($array);
for ($i = 0; $i < $count; ++$i) {
if($array[$i] != $i){
return true;
}
}
return false;
}
for ($x = 0; $x < 1000000; $x++) {
// Pick one
isProgression(array(0,1,2,3,4,5));
isProgression2(array(0,1,2,3,4,5));
}
结果:
isProgression: 0m2.345s
isProgression2: 0m1.906s
答案 1 :(得分:3)
array_map(function($inner){
foreach(array_values($inner) as $key => $value){
if($key != $value)return "WRONG";
}
return "VALID";
},$array)
答案 2 :(得分:1)
尝试:
for ($i = 0; $i < count($array); ++$i) {
if($array[$i] != $i){
//invalid
}
}
//valid
答案 3 :(得分:0)
通过引用传递数组对于小数组可能不是最佳的。
$valid = true;
foreach ($array as &$inner) {
$i = -1;
foreach ($inner as $key => $value) {
if ((++$i != $key) || ($key != $value)) {
$valid = false;
break 2;
}
}
}