我有一个数组已按字母顺序包含所有值:
Alligator
Alpha
Bear
Bees
Banana
Cat
Cougar
现在我只想列出每个首字母开头的内容,如下所示:
A
---
Alligator
Alpha
B
---
Bear
Bees
Banana
C
---
Cat
Cougar
etc...
如何做到这一点?
答案 0 :(得分:22)
解决方案是在变量中保留先前打印的单词的第一个字母,如:
$previous = null;
foreach($array as $value) {
$firstLetter = substr($value, 0, 1);
if($previous !== $firstLetter) echo "\n".$firstLetter."\n---\n\n";
$previous = $firstLetter;
echo $value."\n";
}
注意:如果某些条目以小写字母开头而其他条目以大写字母开头,请使用测试中的strcasecmp
函数代替!==
。
答案 1 :(得分:4)
这是另一个简单的解决方案: -
$result = array();
foreach ($list as $item) {
$firstLetter = substr($item, 0, 1);
$result[$firstLetter][] = $item;
}
echo "<pre>"; print_r($result);
输出: -
Array (
[A] => Array
(
[0] => Alligator
[1] => Alpha
)
[B] => Array
(
[0] => Bear
[1] => Bees
[2] => Banana
)
[C] => Array
(
[0] => Cat
[1] => Cougar
)
)
答案 2 :(得分:1)
我有三个解决方案。 1)创建包含所有字母的另一个数组。然后使用foreach遍历此数组。并且在嵌套的foreach中通过php的strpos方法检查该字母的出现。 这是粗略的代码。
<?php
$alphabets = array ("A","B","C"....); //for all alphabtes
foreach($alphabets as $alphabet)
{
echo $alphabet;
foreach($myArray as $arr)
{
$pos = strpos($arr, $alphabet);
if($pos===flase)
{
//do nothing
}
else
{
echo $arr;
}
}
?>
2)第二种方法具有与上述相同的逻辑。但是在这里你不需要为字母表制作数组。你可以用这种方式获得所有字母。
<?php
foreach(range('a', 'z') as $letter) {
echo $letter;
}
?>
3)第三种解决方案也具有与上述两种相同的逻辑。在这里你可以通过另一种方式获得字母表:)
for ($i=65; $i< =90; $i++) {
$x = chr($i);
print $x;
}
答案 3 :(得分:0)
遍历数组并检查当前项是否以前一个字母开头。如果是这种情况打印你的“A ---”。
$currentLetter = '';
foreach ($list as $item) {
$firstLetter = substr($item, 0, 1);
if ($firstLetter !== $currentLetter) {
echo $firstLetter . "\n---\n";
$currentLetter = $firstLetter;
}
echo $item . "\n";
}
答案 4 :(得分:0)
对于HTML输出:
<h3>A</h3>
<ol>
<li>
<em>tag count</em>
<a href="link to tag">Animal</a>
</li>
<li>
<em>tag count</em>
<a href="link to tag">Aqua</a>
</li>
<li>
<em>tag count</em>
<a href="link to tag">Arthur</a>
</li>
</ol>
<!-- if B not EXIST not show B -->
<h3>C</h3>
<ol>
<li>
<em>tag count</em>
<a href="link to tag">Camel</a>
</li>
<li>
<em>tag count</em>
<a href="link to tag">Crazy</a>
</li>
</ol>
<!-- etc -->
我更改了Artefact2代码并为您分享
<?php $previous = null;
foreach ($dataProvider as $key => $tag) {
$firstLetter = strtoupper(substr($tag['name'], 0, 1));
if($previous !== $firstLetter) {
if($key != 0) {
echo '</ol>';
}?>
<h3 class="alpha">
<span><?php echo $firstLetter;?></span>
</h3>
<ol class="tags main">
<?php } ?>
<li class="tag">
<em><?php echo $tag['TagsCount']; ?></em>
<a href="<?php echo $tag['slug']; ?>">
<strong><?php echo ucfirst($tag['name']); ?></strong>
</a>
<span class="perc" style="width: 90px;"></span>
</li>
<?php if($key == count($dataProvider)-1) {
echo '</ol>';
}
$previous = $firstLetter;
}
?>
最诚挚的问候www.Forum.iSYSTEMS.am
答案 5 :(得分:0)
正如 Shivansh 在上面的回答中所说,我认为这是正确的方法
$result = array();
foreach ($list as $item) {
$firstLetter = substr($item, 0, 1);
$result[$firstLetter][] = $item;
}
echo "<pre>"; print_r($result);
要显示此代码生成的数组,请使用
foreach ( $list as $key => $value ) {
//Do some thing with $key (A,B,C)
foreach ($value as $var){
//Do some thing with $var (Array of A, B ,C)
}
}