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

发布于 2017-01-19 05:11:55 字数 806 浏览 1207 评论 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;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(3

灵芸 2017-10-09 21:23:34

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

<?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 04:53:59

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

$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 => $val) {

if($key+$num > $len) break;
$tmp = array();
for($i=$key; $i< $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 03:03:59

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

$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 && $next
&& ($prev[$check_key] == $row[$check_key])
&& ($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=>$list) {
if($max_len > count($list)) {
unset($result[$k]);
}
}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文