检查阵列中的一致性


Check for coherency in an array?

我有一个数组,里面有这样的元素:

1_elem1
2_elem2
3_elem3

现在我想检查一下那个结构中是否有什么东西错位了。错位意味着:

  1. 前面的数字不成功
  2. 缺少数字

在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是获取前导数字的简单方法。