0

我在这里有一个非常奇怪的帮助请求,让我尽可能地解释它:

我有一个项目数组(我已经对文本进行了哈希处理,因为文本并不重要,这是我将使用的长度)

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

我需要检查的是确保每个值的长度不超过前一个元素的长度大于 1。它们的长度可以减少超过 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

4 回答 4

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

注意循环开始于 1 以避免 -1 索引位于$i = 0

于 2012-11-22T17:15:25.643 回答
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;

}
于 2012-11-22T17:18:32.180 回答
1

在我的脑海中,我可能会将循环更改为:

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

最好也将其粘贴在一个函数中。编辑 - 实际上就像 moonwave99 所做的那样。

于 2012-11-22T17:27:06.857 回答
1

使用current()andeach()允许使用任何类型的键的数组,并且不依赖于第一个键为 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);
于 2012-11-22T17:38:08.397 回答