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个相同的开始字母的名字。
谢谢。
当我明白你的权利...只是使用数组
<?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);
好吧,这将工作的cours,我如何在foreach内而不是在foreach外? – user2635001
我试图将这与我的工作不像我想要的。 – 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
我的foreach内部没有工作。看看更近一些,我为foreach取一个名字作为第一个字母,然后用它来打印一个列表。 – user2635001
那么你可以把函数放在某处,但不能直接放到你的foreach中,哪里出现'AABCHKIUKP'?它在你的'$ manufacturer-> mf_name'中吗?你想剥离第一个字符吗? – swidmann
我已经更新了我的答案,如果这不起作用,你必须更新你的问题,并添加一些关于它的更多信息,来自字符串和输出在哪里...... – swidmann
我不能添加评论,所以我的帖子被转换为评论(感谢stackoverflow :))。解决方案是在这里:http://stackoverflow.com/questions/6723389/remove-repeating-character – aslawin
我已经试过。它如何不为mb(utf-8)字符工作。同样在这里它的内部foreach,所以$信函每次返回名称的第一个字母 – user2635001