检查数组值的序列

时间:2012-11-22 17:09:52

标签: php arrays

我有一个非常奇怪的求助请求,让我尽量解释一下:

我有一系列项目(由于文字不重要,我已经散布了文字,它是长度我将会使用)

Array
(
    [0] => ##
    [1] => ###
    [2] => ###
    [3] => ###
    [4] => ####
    [5] => ###
    [6] => ####
    [7] => #####
    [8] => ##
    [9] => ###
)

我需要检查的是确保每个值的长度不超过前一个元素的长度。它们的长度可以减少超过1,但它们的长度不能超过1.上述数组根据这些规则有效。

然而,下面的数组会出错(请参阅元素4的长度2大于3)。

Array
(
    [0] => ##
    [1] => ###
    [2] => ###
    [3] => ###
    [4] => #####
    [5] => ###
    [6] => ####
    [7] => #####
    [8] => ##
    [9] => ###
)

这是我到目前为止所做的:

<?php
$array = array('##','###','###','###','####','###','####','#####','##','###'); // Valid Array
$array = array('##','###','###','###','#####','###','####','#####','##','###'); // Invalid Array
$tmp = 0;
$i = 0;
$valid = true;
foreach($array as $k => $v) {
    if($i>0&&strlen($v)>$tmp&&strlen($v)>($tmp+1)) {
        $valid = false;
    }
    $tmp = strlen($v);
    $i++;
}
echo ($valid) ? 'Array is valid' : 'Array is invalid';
?>

它有效,但它太乱了,我根本不满意,任何人都有更好的方法来检查这个吗?

4 个答案:

答案 0 :(得分:2)

for($i = 1; $i < count($array); $i++) {
  if( ( strlen($array[$i - 1]) - strlen($array[$i]) ) > 1) {
    $valid = false;
    break;
  }
}

注意循环的开始为1以避免在$i = 0

处具有-1索引

答案 1 :(得分:2)

我认为你不能比这更好 - 你可以将所有内容包装在一个函数中以实现可重用性:

function checkArray($array)
{

  foreach($array as $i => $v)
  {

    if($i==0)
      continue;

    if( ( strlen($v) - strlen($array[$i-1]) ) > 1 ){
      return false;
    }

  }

  return true;

}

答案 2 :(得分:1)

我可能会将循环更改为:

foreach ($array as $k => $v) {
    if ($k == 0) {
        continue;
    }
    if ((strlen($v) - strlen($array[$k - 1])) > 1 ) {
        $valid = false;
        break;
    } 
}

也可能最好将其粘贴在一个功能中。 编辑 - 就像moonwave99实际上完成的那样。

答案 3 :(得分:1)

使用current()each()允许具有任何类型键的数组,并且不依赖于第一个键为0.

   function arr_is_valid(array $arr) {
        $last_len = strlen(current($arr));
        while (list($k,$v) = each($arr) {
          $cur_len = strlen($v);
          if(1 < $cur_len - $last_len) return false;
          $last_len = $cur_len;
        }
        return true;
    }

$valid = arr_is_valid($my_array);