开发者

PHP in_array() can't even match a single character. Strict is set to true

I've seen a million of these threads here already, and read through every single one. That, plus some serious Googling.

UPDATE: I am rewriting this post to include complete code and explanation, so everyone understands what is going on and what I am trying to do.

I am developing using CodeIgniter, so some syntax may look weird if you are not familiar with it.

I have an link bar with letters A-Z. The idea is to find only "active" letters that have content in a particular column (mysql LIKE $letter%). With this information I would be able to "dim" certain "empty" letters if there are any, using CSS.

This function here queries mysql and gets each unique first letter of entries in a column. The result should be anywhere from 0 to 26 matches/array items.

  //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;

  }

After that, I call this function from a controller:

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

then define an $alphabet array.

    $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;

    }

Nothing complicated. All I have to do is check if a single character in a loop matches my alphabet array.

As Col. Shrapnel suggested below, I did some debugging, and dump() of letters from $alphabet and $foundLetters arrays produce different results, so I guess it does point to possible encoding issues, which I am trying to figure out now...

Does anyone have any idea what the hell is going on here??

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

}

Here is the result from dump():

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

and these:

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
 )


got your letters from the file, eh? :)

use var_dump instead or print_r and trim in comparison :)

Edit
Use this code to see what is going on

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++])));
}


Works for me


The only thing in your sample that is strange is the : that comes after the foreach - followed by curly braces will cause a syntax error. Is that the problem, or does your program just not output anything?


I got the expected results as well. But I think your example array is different from what you are actually passing through. Give this a try...

 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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜