0

我有一个看起来像的数组

array (size=7)
  'car_make' => string 'BMW' (length=3)
  'car_model' => string 'M3' (length=2)
  'car_year' => string '2001' (length=4)
  'car_price' => string '10000' (length=5)
  'car_kilometers' => string '100000' (length=6)
  'paint' => string 'black' (length=5)
  'tires' => string 'pirelli' (length=7)

所以基本上有一些基本项目以 car_ 开头,然后是一些附加项目。

我正在尝试搜索每个不是 car_* 的钥匙,所以在这种情况下要涂漆和轮胎。所以我正在做类似的事情

foreach($_SESSION['car'][0] as $key=>$value)
{
    if($key != preg_match('/car_.*/', $key))
    {
        echo 'Match';
    }
}

由于 2 个非 car_ 键,我希望能回显 2 个匹配项。相反,这会为 car_ 键回显 5。

但是当我这样做时

if($key == preg_match('/car_.*/', $key))

它为 2 个非 car_ 键回显了 2 个匹配项。

我在哪里搞砸或误解?

4

3 回答 3

1

preg_match 文档说它的返回值:

如果模式匹配给定的主题,preg_match() 返回 1,如果不匹配,则返回 0,如果发生错误,则返回 FALSE。

所以这首先是行不通的。

我会使用:

if ( substr($key, 0, 4) === "car_" )

...无论如何,这比 preg_match 便宜得多。

于 2013-05-09T00:53:06.113 回答
0

来自http://php.net/manual/en/function.preg-match.php

返回值

如果模式匹配给定的主题,preg_match() 返回 1,如果不匹配,则返回 0,如果发生错误,则返回 FALSE。

因此,您应该将其与 1 或 0 进行比较,而不是与字符串进行比较。

您的代码工作但向后运行的原因是因为将数字与字符串进行比较会产生有趣的结果:

来自http://php.net/manual/en/types.comparisons.php

1 == "" 为假

0 == "" 为真

于 2013-05-09T00:51:57.787 回答
0

根据文档preg_matchtrue在匹配和不匹配时返回false。因此,您似乎对 PHP 的类型转换很感兴趣。

因此,您应该检查而不是比较值

if(true === preg_match('/car_.*/', $key))

这应该照顾它。

此外,根据文档:

如果您只想检查一个字符串是否包含在另一个字符串中,请不要使用 preg_match()。请改用strpos()strstr(),因为它们会更快。

这将是:

if(false === str_pos('car_', $key))
于 2013-05-09T00:53:22.170 回答