PHP-如何最简单的判断二维数组中连续N个元素下的值相等的情况?

WP主题讨论 WP主题讨论 主题:1013 回复:2239

PHP-如何最简单的判断二维数组中连续N个元素下的值相等的情况?

泛泛之交 发布于 2017-01-19 字数 941 浏览 1054 回复 3

N 取决于 数组的长度 (数组长度 > 1 并且 长度为奇数)

例如

array(
array('id'=>1,'type'=>1),
array('id'=>2,'type'=>0),
array('id'=>3,'type'=>1), //这个位置的元素中的type 一定是 1
array('id'=>4,'type'=>1),
array('id'=>5,'type'=>0),
)

数组长度为 5 那么 N = (5+1)/2 = 3

那么就需要查找在这个数组中有没有连续的 3 个 数组中的 type 为 1 的 元素,存在的话返回id;
上边的数组不存在这样的情况。
再举个例子:

array(
array('id'=>1,'type'=>0),
array('id'=>2,'type'=>1),
array('id'=>3,'type'=>0),
array('id'=>4,'type'=>1), //这个位置的元素中的type 一定是 1
array('id'=>5,'type'=>1),
array('id'=>6,'type'=>1),
array('id'=>7,'type'=>1),
)

如上数组应该返回 4,5,6,7

说明:在数组中间的元素的type值一定为 1;

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

灵芸 2017-10-09 3 楼

看了冯义军写的,感觉只要一遍遍历就行了,不用那么复杂,代码如下:

<?php

$arr = array(
array('id'=>1,'type'=>0),
array('id'=>2,'type'=>1),
array('id'=>3,'type'=>1),
array('id'=>4,'type'=>1),
array('id'=>5,'type'=>0),
);

$len = count($arr);
$num = ($len+1)/2;
$ids = array();

foreach($arr as $item) {
if($item['type'] == 1){
$ids[] = $item['id'];
}else{
$ids = array();
}
if(isset($ids[$num-1]))break;
}

根据义军的建议,再次判断一次就行

if(!isset($ids[$num-1])) $ids = array();
var_dump($ids);

?>

不知道是否能够满足你的需求?

灵芸 2017-08-26 2 楼

贴一个我当前使用的方法:

$arr = array(
array('id'=>1,'type'=>0),
array('id'=>2,'type'=>1),
array('id'=>3,'type'=>1),
array('id'=>4,'type'=>1),
array('id'=>5,'type'=>0),
);

$len = count($arr);
$num = ($len+1)/2;
$ids = array();

foreach($arr as $key =&gt; $val) {

    if($key+$num &gt; $len) break;
    $tmp = array();
    for($i=$key; $i&lt; $key+$num;$i++) {
        $tmp[$arr[$i]['id']]= $arr[$i]['type'];
    }
    $v = array_count_values($tmp);
    if($v[1] == $num) {
        $ids = array_keys($tmp);break;
    }

}

var_dump($ids);

想挽留 2017-08-09 1 楼

写了一个方法,提供连续三个值一样的检查,如果需要更多值判断的话,对处理出来的结果再进行一次处理就可以

$arr1 = array(
array('id'=>1,'type'=>1),
array('id'=>2,'type'=>0),
array('id'=>3,'type'=>1), //这个位置的元素中的type 一定是 1
array('id'=>4,'type'=>1),
array('id'=>5,'type'=>0),
);
$arr = array(
array('id'=>1,'type'=>0),
array('id'=>2,'type'=>1),
array('id'=>3,'type'=>0),
array('id'=>4,'type'=>1), //这个位置的元素中的type 一定是 1
array('id'=>5,'type'=>1),
array('id'=>6,'type'=>1),
array('id'=>7,'type'=>1),
);

/
@description 二维数组最长个相同连续值检测
@param $arr - 需要检查的二维数组
@param $check_key - 需要检查的key
@param $skip_value - 不需要检查的值
@return $result - N个相同值连续在一起
/
function check_continue_values($arr,$check_key ='type',$skip_value = 0) {
reset($arr);
$result = array();
while(list($k,$row) = each($arr)) {
if($row[$check_key] == $skip_value){continue;}
$next = current($arr);//each函数执行完成之后,数组指针已经移动到下一个,直接用current就可以获取下一个值
prev($arr); //指针移动到当前元素
$prev = prev($arr);//指针移动到当前元素的前一个指针
next($arr);//指针移动到当前元素
next($arr);//恢复指针原来位置

    if($prev &amp;&amp; $next
       &amp;&amp; ($prev[$check_key] == $row[$check_key])
       &amp;&amp; ($row[$check_key] == $next[$check_key])) {
        $continues = array($prev['id'],$row['id'],$next['id']);
        if($result) {
            $prev_continues = array_pop($result);
            if(count(array_intersect($prev_continues,$continues)) == 2) {
                $result[] = array_unique(array_merge($prev_continues,$continues));
            } else {
                $result[] = $prev_continues;
                $result[] = $continues;
            }
        } else {
            $result[] = $continues;     
        }
    }
}   
$max_len = ceil(count($arr)/2);
foreach($result as $k=&gt;$list) {
    if($max_len &gt; count($list)) {
        unset($result[$k]);
    }
}

return $result;

}
print_r(check_continue_values($arr1));
print_r(check_continue_values($arr));