PHP in_array()甚至不能匹配单个字符。 Strict设置为true

时间:2010-05-01 05:35:48

标签: php arrays codeigniter

我已经在这里看过一百万个这样的线程,并通读每一个。那,加上一些严肃的谷歌搜索。

更新:我正在重写此帖子以包含完整的代码和解释,因此每个人都了解正在发生的事情以及我想要做的事情。

我正在使用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;

    }

没什么复杂的。我所要做的就是检查循环中的单个字符是否与我的字母数组匹配。

正如下面的Col.Srapnel所说,我做了一些调试,来自$ alphabet和$ foundLetters数组的dump()个字母会产生不同的结果,所以我猜它确实指出了 可能的编码问题,我现在想弄清楚......

有谁知道这到底是怎么回事?

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 个答案:

答案 0 :(得分:3)

从文件中收到你的来信,是吗? :)

使用var_dump代替,或者使用print_r和trim进行比较:)

修改
使用此代码查看正在进行的操作

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

答案 1 :(得分:2)

为我工作

答案 2 :(得分:0)

你的样本中唯一奇怪的是:在foreach之后出现 - 然后是大括号会导致语法错误。这是问题,还是你的程序没有输出任何内容?

答案 3 :(得分:0)

我也得到了预期的结果。但我认为你的示例数组与你实际传递的不同。试一试......

 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';
     }
 }