PHP in_array () не может даже соответствовать одному символу. Строгое установлено в true - PullRequest
2 голосов
/ 01 мая 2010

Я уже видел миллион из этих тем и прочитал все. Это плюс серьезный поиск в Google.

ОБНОВЛЕНИЕ: Я переписываю этот пост, чтобы включить полный код и пояснения, чтобы все понимали, что происходит и что я пытаюсь сделать.

Я занимаюсь разработкой с использованием CodeIgniter, поэтому некоторый синтаксис может выглядеть странно, если вы не знакомы с ним.

У меня есть панель ссылок с буквами A-Z. Идея состоит в том, чтобы найти только «активные» буквы, которые имеют содержание в определенном столбце (mysql LIKE $letter%). С помощью этой информации я смогу "затемнить" некоторые "пустые" буквы, если они есть, с помощью CSS.

Эта функция здесь запрашивает mysql и получает каждую уникальную первую букву записей в столбце. Результат должен быть от 0 до 26 совпадений / элементов массива.

  //From am_model.php              
  function getFirstLetter($domainId)
  {

   $q = $this->db->query("SELECT DISTINCT LEFT(alias_name, 1) 
                                     AS letter 
                                     FROM am_aliases 
                                     WHERE domain_id = '" . $domainId . "' 
                                     ORDER BY alias_name;");
   if($q->num_rows > 0):
    foreach($q->result() as $row) 
    {
     $result[] = $row;
    }
    //print_r($result); <-- prints out correct result.
    return $result;
   endif;

  }

После этого я вызываю эту функцию из контроллера:

    $foundLetters = $this->am_model->getFirstLetter($domainId);

затем определите массив $alphabet.

    $alphabet = range('a','z');

    foreach($alphabet as $letter)
    {

         if(in_array($letter, $foundLetters, TRUE)):
                echo $letter . ' found<br />';
         else:
                echo $letter . ' not found<br />';
         endif;

    }

Ничего сложного. Все, что мне нужно сделать, это проверить, соответствует ли один символ в цикле моему алфавитному массиву.

Как предложил полковник Шрапнель ниже, я провел некоторую отладку, и dump() букв из массивов $ alphabet и $ foundLetters дают разные результаты, так что я думаю, что это указывает к возможным проблемам кодирования, которые я пытаюсь выяснить сейчас ...

Кто-нибудь знает, что, черт возьми, здесь происходит?

function dump(&$str) {
  $i=0;
  while (isset($str[$i])) echo strtoupper(dechex(ord($str[$i++])));

}

Вот результат от dump():

a: $alphabet->61 613C6272202F3E<-$foundLetters
b: $alphabet->62 613C6272202F3E<-$foundLetters
c: $alphabet->63 683C6272202F3E<-$foundLetters
d: $alphabet->64 613C6272202F3E<-$foundLetters

и эти:

print_r($alphabet); // all 26 letters

Array ( 
        [0] => a
        [1] => b
        [2] => c
        ...            
        [23] => x
        [24] => y
        [25] => z
 )

 print_r($foundLetters); // dynamic array.

 Array ( 
        [0] => b
        [1] => s
 )

Ответы [ 4 ]

3 голосов
/ 01 мая 2010

получил ваши письма из файла, а? :)

используйте var_dump вместо или print_r и обрезайте по сравнению:)

Редактировать
Используйте этот код, чтобы увидеть, что происходит

foreach ($alphabet as $letter) {
  foreach ($empty_letters as $empty) {
    dump($letter);
    echo " ";
    dump($empty);
    echo "<br>";
    if ($letter == $empty) {
      echo "$letter was found in \$empty_letters<br>\n";
      break;
    }
  }
}

function dump(&$str) {
  $i=0;
  while (isset($str[$i])) echo strtoupper(dechex(ord($str[$i++])));
}
2 голосов
/ 01 мая 2010

у меня работает

0 голосов
/ 01 мая 2010

Я получил ожидаемые результаты. Но я думаю, что ваш пример массива отличается от того, через что вы на самом деле проходите. Попробуйте ...

 foreach(array_values($alphabet) as $letter){
     echo $letter . '<br />'; // Correctly prints out every letter from $alphabet.
     if(in_array($letter, $emptyLetters)) {  // $strict is set
         // do something
         echo 'found';
     }
 }
0 голосов
/ 01 мая 2010

Единственная странная вещь в вашем образце - это то, что следует после foreach - после фигурных скобок произойдет синтаксическая ошибка. Это проблема, или ваша программа просто ничего не выводит?

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