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

WBOY
Release: 2016-06-23 14:23:43
Original
1896 people have browsed it

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);
Copy after login
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);?>
Copy after login
Copy after login


判断$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);?>
Copy after login
Copy after login


判断$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;}
Copy after login
Copy after login

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

$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;}
Copy after login
Copy after login



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

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

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!