检查数组问题的值

时间:2011-03-26 22:15:01

标签: php arrays loops

这是在扼杀我。它似乎很简单,但由于某种原因,我无法让它发挥作用。

基本上我所拥有的是一个接受单个字符串$name作为变量的函数,然后它通过并根据数组中的值检查该变量。如果在数组中找到变量,则返回TRUE。从另一个函数的foreach循环中调用此函数(每次都提交一个新的$name变量。)

我已经尝试了3种不同的方法来检查数组中的变量,但它永远无法正常工作。

1。)使用其他foreach()循环

function check($name) {

$commaSeparatedString = 'First Name, Second Name, Third Name';
$array = explode(",", $commaSeparatedString);

foreach($array as $arrayValue) {
if($arrayValue == $name) { 
return TRUE; 
}
else {
return FALSE; 
}
}
}
使用in_array()

2。)

function check($name) {
  $commaSeparatedString = 'First Name, Second Name, Third Name';
  $array = explode(",", $commaSeparatedString);

    if(in_array($name, $array, TRUE)) {
      return TRUE;
    }
    else {
      return FALSE;
    }
}

3。)手动循环遍历数组中的每个值并检查匹配

function check($name) {
$commaSeparatedString = 'First Name, Second Name, Third Name';
$array = explode(",", $commaSeparatedString);
$count = count($array);
$i = 0; 
while($i<=$count) {
  if(isset($array[$i]) && $array[$i] == $name) {
      $i++;
      echo $i;
      return TRUE;
              break;

      }
  else { 
  $i++;
  echo $i;
  return FALSE; }
}

}

这是运行check()的函数的简化部分:

function loopCheck() {
$group = array($obj1, $obj2, $obj3, $obj4, $obj5);
foreach($group as $groupValue) {
  $name = $groupValue->name; 
  $ignore = $this->check($name);
  if($ignore == TRUE) { }
  else { echo $name; }
}
}

check()的所有三种变体的结果都是相同的。除TRUE的第一个值外,它会为每个$groupValue返回$array。因此,如果$name的{​​{1}}为“名字”,则会返回$obj2,但如果TRUE的{​​{1}}为“第二名称”仍然返回$name。我回答$obj3在一点上的第三个变化,并且值始终保持在1,所以我知道该方法有一些错误,但我不知道为什么结果与其他2相同方法

5 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。导致所有代码失败的原因是您explode ',',因此在字符串中留下空格。您应该explode', '

但是第一个代码仍然是错误的:foreach将在第一次迭代时返回,因此只检查第一个元素。循环应该是:

foreach ($array as $arrayValue) {
    if ($arrayValue == $name) { 
        return true; 
    }
}

return false;

同样适用于您的上一个代码。

最好的变种可能是第二种,这是一个稍微缩短的调整变体:

function check($name) {
    $commaSeparatedString = 'First Name, Second Name, Third Name';

    return in_array($name, explode(', ', $commaSeparatedString), true));
}

答案 1 :(得分:1)

你修剪了()你的琴弦吗?

它将在第一个字符串上工作,因为它以“First String”开头,但第二个explode()ed字符串将是“spaceSecond String”。

答案 2 :(得分:1)

你不应该把

Return false;

在你的其他地方,你应该把它放在整个循环之后。 还要记住,如果你想爆炸 a,b,c 是[a,b,c]你必须使用

explode(", ",$str); //note the space

答案 3 :(得分:1)

我认为这些技术中的任何一种都可以使用,但你只会遇到小错误。

我已经修好了下面的第一个。您不希望在else子句中使用return false。你想要它在foreach循环之后,只要它无法匹配每一次。

function check($name) {

$commaSeparatedString = 'First Name, Second Name, Third Name';
$array = explode(",", $commaSeparatedString);

foreach($array as $arrayValue) {
    if($arrayValue == $name) { 
        return TRUE; 
    }
}
 return false;
}

in_array版本可能更简单。请注意,if ($val) {return true;} else {return false;}没有理由,只需执行return $val

function check($name)
{
    $csvs = 'First Name, Second Name, Third Name';
    return in_array($name, explode(', ', $csv));
    //return in_array(trim(strtoupper($name)), array_map('trim', explode(', ', strtoupper($csv))));
    //try this second way is kind of over-kill thorough, but try it if you still get false where true is expected
}

您还必须trim您制作的数组的字符串或explode(', ' $csv)的空格。否则array的元素将具有前导空格。

答案 4 :(得分:1)

问题是当你在check函数中进行爆炸时,有些部分有空格,因为逗号后面有空格。