複数のデータ範囲セットが重複しているかどうかを効果的に判断するにはどうすればよいでしょうか?

WBOY
リリース: 2016-06-23 14:23:43
オリジナル
1918 人が閲覧しました

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 in 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] => 配列
(

[3] => 配列
(
[0] => 6000
[1] => 7000
)

[4] => 配列
(
[0] =&gt; [1] =&gt; [5] =&gt;

これらの範囲データのセットに重複フラグがあるかどうかを取得したいです
重複がある場合は false を返します
重複しない場合は true を返します
新しく生成する必要はありません。重複のない配列。
array(
array(5000, 7000),
array(2000, 6000),
array(8000, 9000),
array(5000, 7000),
);この状況では重複はなく、 true を返すことが期待されます
array(
array(2000, 3000),
array(3000, 4000)


<?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);?>
ログイン後にコピー
ログイン後にコピー


$re sult_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),

いくつかの変更を加えませんか?
元の配列に重複がある場合、重複を除いて生成された配列は元の配列より大きくなければなりません

求出具体范围按版主的程序
唉,单纯求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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート