我有一个非常奇怪的求助请求,让我尽量解释一下:
我有一系列项目(由于文字不重要,我已经散布了文字,它是长度我将会使用)
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';
?>
它有效,但它太乱了,我根本不满意,任何人都有更好的方法来检查这个吗?
答案 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 :(得分: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);