我有数据的像1, 2, 3, 4, 5, 6, 7, 8, 9, 10
然后我这些数据分离成2个基团,其是
$groupA = range(1, 5)
$groupB = range(6, 10)
例如束,我有$data = array(1, 4)
和它将返回这属于组A.同样, $data = array(7,8)
,它将返回给我B组。
那么我怎么写一个脚本让$data = array(1, 4, 6, 7)
回到我的A组和B组?
谢谢
我有数据的像1, 2, 3, 4, 5, 6, 7, 8, 9, 10
然后我这些数据分离成2个基团,其是
$groupA = range(1, 5)
$groupB = range(6, 10)
例如束,我有$data = array(1, 4)
和它将返回这属于组A.同样, $data = array(7,8)
,它将返回给我B组。
那么我怎么写一个脚本让$data = array(1, 4, 6, 7)
回到我的A组和B组?
谢谢
您可能需要使用array_intersect
:那an empty array evaluates to false
而一个有至少一个元素的计算结果为true
$groupA = range(1, 5);
$groupB = range(6, 10);
$data = array(1, 4, 6, 7);
$foundGroups = array();
if(array_intersect($data, $groupA))
$foundGroups[] = 'A';
if(array_intersect($data, $groupB))
$foundGroups[] = 'B';
print_r($foundGroups);
注。
警告:如果您必须与很多元素一起工作,您可能需要使用手动方法并停止找到第一个公共元素。 array_intersect
找到所有的共同元素,你并不真的需要。
你的意思是这样吗?
$data = array(1, 4, 6, 7)
$groupA = array();
$groupB = array();
foreach ((array) $data as $value) {
if ($value < 6) {
$groupA[] = $value;
} else {
$groupB[] = $value;
}
}
格尔茨,
XpertEase
尝试使用array_intersect与每一个组......如果不是空的交集就意味着一些元素是该组中...
$data = range(1,9);
$groupA = array_filter($data, "less");
$groupB = array_filter($data, "more");
function less ($v) {
return $v < 6;
}
function more ($v) {
return ! less($v);
}
干净的解决方案。但对于大型阵列来说效率不高。即使检查第一个值表明该子阵列属于较大的阵列,它也会完全交叉。 – DhruvPathak 2011-06-08 08:01:41
@DhruvPathak你是对的。手动方法在更大的阵列上效率更高。甚至可能在搜索开始之前对组和数据进行排序。但这取决于他的情况。我发布的是相对较小数据集的干净解决方案。 – 2011-06-08 08:03:23