1

我无法检查逗号分隔的字符串是否包含另一个逗号分隔的字符串。

假设我有两个字符串

$stringA="red,blue,yellow,green,black,grey,purple,pink,khaki,lemon,orange,white,maroon";
$stringB="blue,green,white,pink,maroon";

我要检查的是其中是否$stringB包含颜色$stringA?我能想到的唯一方法是转换为数组,并使用函数$stringA一一检查颜色。in_array还有其他更简单的方法吗?

提前致谢

4

3 回答 3

2
$stringA="red,blue,yellow,green,black,grey,purple,pink,khaki,lemon,orange,white,maroon";
$stringB="blue,green,white,pink,maroon";

$arrayA = explode(',', $stringA);
$arrayB = explode(',', $stringB);

$min = min(array(
    count($arrayA),
    count($arrayB),
));

$AcontainsB = ($min == count(array_intersect($arrayA, $arrayB)));
于 2013-01-07T17:00:52.587 回答
2

我认为比较数组不是坏主意,但你也可以这样做:

$stringATmp = ','.$stringA.',';
$colors = explode(',', $stringB);
$contains = true;
foreach ($colors as $color) {
    if (strpos($stringATmp, ','.$color.',') === false) {
        $contains = false;
        break;
    }
}
于 2013-01-07T16:50:50.493 回答
1

有一些方法比其他方法更快,但在概念上没有比将数据加载到某种数据结构中更容易的方法。由于您正在讨论以任意顺序检查项目列表与可以以任意顺序排列的另一个项目列表,因此没有捷径可以将引用列表(stringA)放入数据结构,然后在中查找 stringB 列表那个数据结构。

一种加快速度的方法。

  1. 将 stringA 分解成一个数组。
  2. 数组翻转 stringA 数组,使颜色成为数组中的键(无论值是什么)。
  3. 现在,您可以使用以下代码从分解的字符串 B 中查找每种颜色:

像这样的东西:


$stringAArray = explode(',', $stringA);
$stringAArray = array_flip($stringAArray);
$stringBArray = explode(',',$stringB);
$itemsToFind = count($stringBArray);
foreach ($stringBArray as $colorFromB) {
    if (array_key_exists($colorFromB, $stringAArray)) {
        $itemsToFind--;
    }
}
if ($itemsToFind == 0) {
    echo "All B items are in A"
}

这是一个非常快速的查找,并且适用于 A 和 B 中的许多项目。

最后一点:对于较小的数组,通过它in_array会比较快。

于 2013-01-07T16:51:18.887 回答