PHP的foreach问题

问题描述:

里面我有这样的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

当我明白你的权利...只是使用数组

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

$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

若要去除仅同一连续字符,你可以使用这个:

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