这是在扼杀我。它似乎很简单,但由于某种原因,我无法让它发挥作用。
基本上我所拥有的是一个接受单个字符串$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相同方法
答案 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函数中进行爆炸时,有些部分有空格,因为逗号后面有空格。