请问如何有效判断几组数据范围是否有交集

php中文网
发布: 2016-06-23 14:23:43
原创
2179人浏览过

php

5000~7000
2000~6000
8000~9000
4000~8500
5000~7000
请问php中这几组随机的数据怎么样更有效的判断是否有重复?

期望值是
2000~4000
4000~5000
5000~6000
6000~7000
7000~8500
8500~9000


回复讨论(解决方案)

本帖最后由 xuzuning 于 2013-10-09 09:00:13 编辑

$a = array(  array(5000, 7000),  array(2000, 6000),  array(8000, 9000),  array(4000, 8500),  array(5000, 7000),);$r = array();foreach($a as $v) {  $r[] = $v[0];  $r[] = $v[1];}$r = array_unique($r);sort($r);$a = array();for($i=0; $i<count($r)-1; $i++) $a[] = array($r[$i], $r[$i+1]);;print_r($a);
登录后复制
Array
(
    [0] => Array
        (
            [0] => 2000
            [1] => 4000
        )

    [1] => Array
        (
            [0] => 4000
            [1] => 5000
        )

    [2] => Array
        (
            [0] => 5000
            [1] => 6000
        )

    [3] => Array
        (
            [0] => 6000
            [1] => 7000
        )

    [4] => Array
        (
            [0] => 7000
            [1] => 8000
        )

    [5] => Array
        (
            [0] => 8000
            [1] => 8500
        )

    [6] => Array
        (
            [0] => 8500
            [1] => 9000
        )

)

真的很迅速,谢谢版主。

我想获得这几组范围数据是否有重复的flag,
有重复返回false,
无重复返回true,
不需要生成新的无重复的数组。
array(
  array(5000, 7000),
  array(2000, 6000),
  array(8000, 9000),
  array(4000, 8500),
  array(5000, 7000),
);

以下这种情况无重复,期望返回true
array(
  array(2000, 3000),
  array(3000, 4000),
  array(4000, 5000)
);

<?php$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");$array2 = array("a" => "green", "b" => "yellow", "blue", "red");$result_array = array_intersect_assoc($array1, $array2);print_r($result_array);?>
登录后复制
登录后复制


判断$result_array是否为空

<?php$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");$array2 = array("a" => "green", "b" => "yellow", "blue", "red");$result_array = array_intersect_assoc($array1, $array2);print_r($result_array);?>
登录后复制
登录后复制


判断$result_array是否为空



array_intersect_assoc
这个二维数组没法判断啊,
而且需要这种情况,不属于交集范围的。
array(
  array(2000, 3000),
  array(3000, 4000),
  array(4000, 5000)
);

你不会变通一下吗?
如果原始数组有重复,那么生成的无重复数组就一定比原始数组大

求出具体范围按版主的程序
唉,单纯求true,false不就更简单了:
把任意两项的最小值跟另一项最大值比较就是了,一旦有交集->break循环,如果直到循环结束,就是无交集

你不会变通一下吗?
如果原始数组有重复,那么生成的无重复数组就一定比原始数组大

谢谢版主。
通过重新排序,重新生成新的无重复数组,
如果这个无重复数组元素个数发生变化,代表原始数组是有交集的,对吗?

像以下这两种情况似乎无法正确判断flag
$a = array(
  array(5000, 7000),
  array(6000, 8200),
  array(8000, 9000)
);

$a = array(
  array(5000, 5500),
  array(6000, 6500),
  array(8000, 8500)
);

还有没有更有效的方法呢。


只需要判别是否包含,可以写成函数
还是沿袭开始的思路

$a = array(  array(5000, 7000),  array(2000, 6000),  array(8000, 9000),  array(4000, 8500),  array(5000, 7000),);var_dump(foo($a)); //bool(false)$a = array(  array(5000, 7000),  array(6000, 8200),  array(8000, 9000));var_dump(foo($a)); //bool(false)$a = array(  array(5000, 5500),  array(6000, 6500),  array(8000, 8500));var_dump(foo($a)); //bool(true)function foo($a) {  $r = array_unique(call_user_func_array('array_merge', $a));  sort($r);  foreach($a as $v) {    if(array_search($v[0], $r) != array_search($v[1], $r) - 1) return false;  }  return true;}
登录后复制
登录后复制

只需要判别是否包含,可以写成函数
还是沿袭开始的思路

$a = array(  array(5000, 7000),  array(2000, 6000),  array(8000, 9000),  array(4000, 8500),  array(5000, 7000),);var_dump(foo($a)); //bool(false)$a = array(  array(5000, 7000),  array(6000, 8200),  array(8000, 9000));var_dump(foo($a)); //bool(false)$a = array(  array(5000, 5500),  array(6000, 6500),  array(8000, 8500));var_dump(foo($a)); //bool(true)function foo($a) {  $r = array_unique(call_user_func_array('array_merge', $a));  sort($r);  foreach($a as $v) {    if(array_search($v[0], $r) != array_search($v[1], $r) - 1) return false;  }  return true;}
登录后复制
登录后复制



这句话太美妙了。多谢版主大人。
array_search($v[0], $r) != array_search($v[1], $r) - 1

以上代码我再把
array(
  array(2000, 3000),
  array(3000, 4000),
  array(4000, 5000)
);
的情况考虑进去就可以大功告成了。
非常感谢。m( _ _ )m

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号