在foreach循环中不等于执行相反

时间:2013-05-09 00:46:33

标签: php arrays foreach

我有一个看起来像

的数组
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匹配。

我在哪里弄乱或误解?

3 个答案:

答案 0 :(得分:1)

来自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 ==“”为TRUE

答案 1 :(得分:1)

preg_match docs说明了它的返回值:

  

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

所以这不会起作用。

我会用:

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

...无论如何,作为一个操作比preg_match便宜得多。

答案 2 :(得分:1)

根据文档preg_match在匹配时返回true,在不匹配时返回false。所以看起来你正在玩PHP的类型转换。

所以不要比较你应该检查的值

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

这应该照顾它。

另外,根据文档:

  

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

这将是:

if(false === str_pos('car_', $key))