PHP in_array () hatta tek bir karakterle maç olamaz.

4 Cevap php

Ben zaten burada bu konuları bir milyon gördüm ve her biri ile okudum. Yani, artı bazı ciddi Googling.

UPDATE: Ben tam kodu ve açıklama eklemek için bu yazı yeniden yaşıyorum, bu yüzden herkes ne olup bittiğini anlar ve yapmak ne çalışıyorum.

Ben CodeIgniter kullanarak geliştiriyorum, bu yüzden onunla aşina değilseniz bazı sözdizimi garip görünebilir.

Ben harfleri A-Z ile bir bağlantı çubuğuna sahip. Fikir belirli bir sütuna (mysql LIKE $letter%), içeriğin sadece "aktif" harfleri bulmak. Bu bilgi ile ben eğer varsa CSS kullanarak, bazı "boş" harfleri "dim" mümkün olacaktır.

Burada Bu fonksiyon mysql sorgular ve bir sütun girişlerin her biri eşsiz ilk harfini alır. Sonuç 0 26 karşılaşmalar / dizi öğeleri her yerde olmalıdır.

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

  }

Bundan sonra, bir denetleyicisi bu işlevi çağırır:

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

sonra $alphabet dizi tanımlamak.

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

    }

Hiçbir şey karmaşık. Ben yapmam gereken bir döngü içinde bir tek karakter benim alfabe dizisi eşleşirse kontrol etmektir.

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...

Herkes oluyor burada ne herhangi bir fikir var mı?

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

}

Buradan sonuç dump():

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

bu:

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 Cevap

eh, dosyadan mektuplar var? :)

var_dump yerine veya print_r kullanmak ve karşılaştırma süs :)

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

Benim için çalışıyor

$alphabet = array ("a", "b", "c");
$empty_letters = array ("b");

foreach ($alphabet as $letter)
{
  if (in_array($letter, $empty_letters, true))
  {
    echo "$letter was found in \$empty_letters\n";
  }

}

?>

Garip senin örneğindeki tek şey: yani foreach sonra gelir - kaşlı ayraçlar tarafından izlenen bir sözdizimi hatası neden olur. Olduğunu sorun, ya da program sadece çıkış şey değil mi?

Ben de beklenen sonuçları aldım. Ama senin örnek, dizi aslında geçerek ne farklı olduğunu düşünüyorum. Bu bir şans verin ...

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