我有一个数组,里面有这样的元素:
1_elem1
2_elem2
3_elem3
现在我想检查一下那个结构中是否有什么东西错位了。错位意味着:
- 前面的数字不成功
- 缺少数字
在PHP中,最短的方法是什么?我想对数组进行排序,并检查每个元素是否以数字开头。这将解决2。我不知道该怎么做。虽然
如果你能解决第二个问题,那么你可以检查这个数字是否等价于数组的索引,并考虑到到那时丢失的数字的数量。
也就是说,每个元素的索引应该等于前面的数字。除非在过去的元素中缺少一个数字,但如果你考虑到这一点,你可以包括一个增量并减去这个值。
这是数组和正则表达式的一种组合。
<?php
$arr = array( // here is our array
"1_elem1",
"4_elem2", // here is an unexpected value
"3_elem3"
);
$arr = array_values($arr); // if our array has custom keys change it to consecutive numbers
try {
array_walk($arr, function($val, $key)
{
$key++; // add 1 to the index ( because starts at 0)
$pattern = "#".$key."_elem".$key."#"; // write down our pattern
if(!preg_match($pattern, $val))
{
throw new Exception("Not in sequence: ".$val, 1); // if not in sequence then throw an error
}
});
echo "Array has sequential values";
} catch (Exception $e) {
echo $e;
die();
}
既然你要求"最短",那怎么样
function check($array) {
for ($i = count($array)-1; 0 < $i; $i--)
if (1 !== ((int)$array[$i] - (int)$array[$i-1]))
return false;
return true;
}
从最后开始向后走,计算这个元素和上一个元素之间的差异,如果不是一个,则返回false。否则返回true。请注意,将类型转换为int是获取前导数字的简单方法。