0

私はここで信じられないほど奇妙な助けを求めています。可能な限りそれを説明しようと思います。

アイテムの配列があります(テキストは重要ではないため、テキストをハッシュしました。使用する長さです)

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

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

を使用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);
于 2012-11-22T17:38:08.397 に答える
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 に答える