Проверка значения в отношении проблемы с массивом - PullRequest
2 голосов
/ 27 марта 2011

Это убивает меня.Это кажется таким простым, но по какой-то причине я не могу заставить его работать.

По сути, у меня есть функция, которая принимает одну строку $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; 
}
}
}

2.) с использованием in_array()

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 из $obj2 было 'Имя', оно вернуло бы TRUE, но если $name из $obj3 было 'Второе имя', все равно возвращается FALSE.Я повторил $i для третьего варианта в одной точке, и значение постоянно оставалось равным 1, поэтому я знаю, что в этом методе есть какая-то ошибка, но я не знаю, почему результат будет таким же, если использовать другие 2 метода.

Ответы [ 5 ]

2 голосов
/ 27 марта 2011

Есть несколько проблем с вашим кодом. Тот, который вызывает сбой всего кода, состоит в том, что вы 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 голос
/ 27 марта 2011

Проблема в том, что когда вы делаете разнесение в функции проверки, некоторые части имеют пробелы, потому что после запятой есть пробел.

1 голос
/ 27 марта 2011

Вы не должны ставить

Return false;

на другое, вы должны поставить его после всего цикла.Также имейте в виду, что если вы хотите взорвать a, b, c , чтобы стать [a, b, c], вы должны использовать

explode(", ",$str); //note the space
1 голос
/ 27 марта 2011

Я думаю, что любой из этих методов будет работать, но у вас просто небольшие ошибки.

Я исправил первый ниже. Вы не хотите 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 будут иметь начальный пробел.

1 голос
/ 27 марта 2011

Вы обрезали () ваши строки?

Это будет работать с первой строкой, так как она начинается с "First String", но вторая строка explode () будет "spaceSecond String".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...