2015-11-03 79 views
0

裏面我有這樣的foreach:PHP的foreach問題

<?php foreach ($manufacturers as $key => $manufacturer) { 


     if($manufacturer->virtuemart_manufacturercategories_id == 1){ 
      $lang = 'heb'; //Hebrew 
     } else { 
      $lang = 'eng'; //English 
     } 

     //add to letter list 


     $letter = mb_substr($manufacturer->mf_name, 0, 1, 'UTF-8'); 
     ${'html_letters_'.$lang}[] = $letter; 

     /* 
     echo '<pre>'; 
     print_r($manufacturer); 
     echo '</pre>';*/ 

     $link = JROUTE::_('index.php?option=com_virtuemart&view=category&virtuemart_manufacturer_id=' . $manufacturer->virtuemart_manufacturer_id); 

     ${'html_manufacturers_'.$lang} .= '<div class="manufacturer" data-lang="'.$lang.'" data-letter="'.$letter.'"><a href="'.$link.'">'; 
     ?> 
     <?php 
     if ($manufacturer->images && ($show == 'image' or $show == 'all')) { 
      ${'html_manufacturers_'.$lang} .= $manufacturer->images[0]->displayMediaThumb('',false); 
     } 
     if ($show == 'text' or $show == 'all') { 
      ${'html_manufacturers_'.$lang} .= '<div>'.$manufacturer->mf_name.'</div>'; 
     } 
      ${'html_manufacturers_'.$lang} .= '</a> 
     </div> <!-- /manufacturer -->'; 

     if ($col == $manufacturers_per_row){ 
      $col = 1; 
     } else { 
      $col++; 
     } 
    } 



    ?> 

我如何檢查,如果我有超過2個相同的字母和取消所有其他人,但保持一個。

字母的輸出是:

AABCHKIUKP 

我想這將是:

ABCHKIUKP 

我該怎麼辦呢?

編輯:我已更新所有的foreach代碼。問題是如果我有更多的名字相同的起始字母EG:香氣,空氣循環採取第一個字母A和foreach他2次,我想只顯示一個,如果有甚至10個相同的開始字母的名字。

謝謝。

+0

我不能添加評論,所以我的帖子被轉換爲評論(感謝stackoverflow :))。解決方案是在這裏:http://stackoverflow.com/questions/6723389/remove-repeating-character – aslawin

+0

我已經試過。它如何不爲mb(utf-8)字符工作。同樣在這裏它的內部foreach,所以$信函每次返回名稱的第一個字母 – user2635001

回答

0

當我明白你的權利...只是使用數組

<?php 
     $letters = array(); 
     foreach ($manufacturers as $key => $manufacturer) { 
      .... 
      $letter = mb_substr($manufacturer->mf_name, 0, 1, 'UTF-8'); 
      $letters[] = $letter; 
     } 
     $uni = array_unique($letters) 
     echo implode('',$uni); 
+0

好吧,這將工作的cours,我如何在foreach內而不是在foreach外? – user2635001

+0

我試圖將這與我的工作不像我想要的。 – user2635001

0
$s = 'AABCHKIUKP'; 

$letters = $letters = preg_split('/(?<!^)(?!$)/u', $s); //utf8 
$prev_letter = ''; 
$temp = ''; 
foreach($letters as $key => $letter) { 
    if (!($letter === $prev_letter)) { 
     $temp .= $letter; 
    } 
    $prev_letter = $letter; 
} 
echo $temp; 

結果:

ABCHKIUKP

信息關於打破了UTF8字符串數組你可以在這裏找到評論mb_split

0

若要去除僅同一連續字符,你可以使用這個:

function stripConsecutiveChars($string) { 
    // creates an array with chars from the string 
    $charArray = str_split($string); 

    // saves the last char thats on the new string 
    $lastChar = ""; 

    // variable for the new string to return 
    $returnString = ""; 

    foreach($charArray as $char) { 
     if($char === $lastChar) continue; 

     $lastChar = $char;// save current char 
     $returnString .= $char;// concat current char to new string 
    } 

    return $returnString; 
} 

$string = "AABCHKIUKP"; 
echo stripConsecutiveChars($string); 

在您的例子,你可以試試這個:

... 
$letter = mb_substr($manufacturer->mf_name, 0, 1, 'UTF-8'); 
$lastLetter = end(${'html_letters_' . $lang});//point to last element in array 
reset(${'html_letters_' . $lang});// reset the pointer 
if($letter === $lastLetter) { 
    // i guess you just want to continue? 
    continue; 
} 
... 

OUTPUT:

ABCHKIUKP

+0

我的foreach內部沒有工作。看看更近一些,我爲foreach取一個名字作爲第一個字母,然後用它來打印一個列表。 – user2635001

+0

那麼你可以把函數放在某處,但不能直接放到你的foreach中,哪裏出現'AABCHKIUKP'?它在你的'$ manufacturer-> mf_name'中嗎?你想剝離第一個字符嗎? – swidmann

+0

我已經更新了我的答案,如果這不起作用,你必須更新你的問題,並添加一些關於它的更多信息,來自字符串和輸出在哪裏...... – swidmann