以列表中的A-Z和非A-Z字符输出

时间:2014-02-11 12:14:13

标签: php

我正在尝试将任何数组输出到目录列表格式。 A-Z正在工作,但我想将不以A-Z开头的单词输出到符号#。

E.G。 1234,#qwerty,!qwerty等应该排序到#group。

<?php
$aTest = array('apple', 'pineapple', 'banana', 'kiwi', 'pear', 'strawberry', '1234', '#qwerty', '!qwerty');

$range = range('A','Z');
$range[] = "#";
$output = array();

foreach($range AS $letters){
    foreach($aTest AS $fruit){
        if(ucfirst($fruit[0]) == $letters){
            $output[$letters][] = ucfirst($fruit);
        }
    }
}

foreach($output AS $letter => $fruits){
    echo $letter . "<br/>--------<br/>\n";
    sort($fruits);
    foreach($fruits AS $indFruit){
        echo $indFruit . "<br/>\n";
    }
    echo "<br/>\n";
}
?>

3 个答案:

答案 0 :(得分:1)

$output['#'] = array();

foreach($range as $letter){
    $output[$letter] = array();
}

foreach($aTest AS $fruit){
    $uc = ucfirst($fruit);
    if(array_search($uc[0], $range) === FALSE){
        $output['#'][] = $uc;
    } else {
        $output[$uc[0]][] = $uc;
    }
}

注意我已经删除了外循环,因为你不需要它

答案 1 :(得分:1)

您应该颠倒两个foreach循环的顺序,使用break和一个临时变量:

foreach($aTest as $fruit){
$temp = 1;
    foreach($range as $letters){
        if(ucfirst($fruit[0]) == $letters){
            $output[$letters][] = ucfirst($fruit);
            $temp = 0;
            break;
        }
    }
    if($temp){
        $output["#"][] = $fruit;
    }
}

ksort($output);

为避免这些并发症,您只能使用一个foreach循环和内置PHP函数in_array

foreach($aTest as $fruit){
$first = ucfirst($fruit[0]);
    if(in_array($first, $range)){
        $output[$first][] = ucfirst($fruit);
    }
    else{
        $output["#"][] = $fruit;
    }
}

ksort($output);

答案 2 :(得分:0)

我首先使用ctype_alpha()对它们进行分类,然后按数组键对结果进行排序:

$output = array();

foreach ($aTest as $word) {
        $output[ctype_alpha($word[0]) ? strtoupper($word[0]) : '#'][] = $word;
}

ksort($output);