PHP-如何最简单的判断二维数组中连续N个元素下的值相等的情况?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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);
?>
不知道是否能够满足你的需求?
贴一个我当前使用的方法:
$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);
写了一个方法,提供连续三个值一样的检查,如果需要更多值判断的话,对处理出来的结果再进行一次处理就可以
$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));