对无序数组进行排序,并使用字母键将其变为多维数据?

时间:2014-02-19 19:10:28

标签: php arrays sorting multidimensional-array

我有一个表单,您可以在其中输入不同的电影并用“|”分隔。该数据库目前包含:

Spider-man|Spider-man 2|Spider-man 3|Apple|Google|Banana|Citrus

我已经完成了这个文本字符串的explode(),所以每个标题都进入一个数组:

$collection = explode('|', $collection);

为了按字母顺序排序,我这样做了:

array_multisort($collection);

到目前为止,没关系。但是,现在我需要使这个数组成为多维的,每个键对应于值开头的字母。它应该是这样的:

Array(
    [A] => Array(
        'Apple'
    )
    [B] => Array(
        'Banana'
    )
    [C] => Array(
        'Citrus'
    )
    [G] => Array(
        'Google'
    )
    [S] => Array(
        'Spider-man',
        'Spider-man 2',
        'Spider-man 3'
    )
)

我怎样才能做到这一点?

提前致谢, 菲利普

3 个答案:

答案 0 :(得分:1)

不是你应该在数据库中存储东西的方式。你应该有一个表,该表与那个将电影各自保存在自己的行中的表相关联。话虽如此:

//array_multisort($collection); // don't need this
sort($collection);
foreach($collection as $movie) {
    $result[$movie[0]][] = $movie;
}

如果某些电影以小写字母开头,则:

foreach($collection as $movie) {
    $result[strtoupper($movie[0])][] = $movie;
}
ksort($result);

答案 1 :(得分:1)

没有built-in功能。你需要自己制作一些东西。像这样:

$string = 'Spider-man|Spider-man 2|Spider-man 3|Apple|Google|Banana|Citrus';
$result = array();
foreach(explode('|', $string) as $item) {
    $firstLetter = $item[0];
    if(!isset($result[$firstLetter])) {
        $result[$firstLetter] = array();
    }
    $result[$firstLetter][] = $item;
}

ksort($result);
var_dump($result);

答案 2 :(得分:0)

$input = 'Spider-man|Spider-man 2|Spider-man 3|Apple|Google|Banana|Citrus';

$collection = array();
$movies = explode('|', $input);

sort($movies);

foreach ($movies as $movie) {
    $collection[strtoupper($movie[0])][] = $movie;
}

print_r($collection);