php-按字母范围对数组元素进行分组

我有一个简单的数组,其中包含一些名称,我想按它们的首字母分组.
例如.所有以A到C作为第一个字母的名称都进入一个数组,而D到F则进入另一个名称,依此类推.

有比使用大量其他方法更好的方法吗?

解决方法:

我现在提供四种方法.可以通过更改$size来修改全部以允许更大或更小的组.

> 2创建“ AB”,“ CD”等.
> 3创建“ ABC”,“ DEF”等.
> 4创建“ ABCD”,“ EFGH”等.
> 15创建“ ABCDEFGHIJKLMNO”,“ PQRSTUVWXYZ”

代码#1通过使用2个foreach()循环和每个值的第一个字符的比较,将值作为数组处理.这是最容易理解的.

$fruits=array("date","guava","lemon","Orange","kiwi","Banana","apple");
natcasesort($fruits);  // pre-sort them for alphabetized output
$size=3;  // <-modify group sizes here
$chunks=array_chunk(range('A','Z'),$size);  // 0=>["A","B","C"],1=>["D","E","F"],etc...
foreach($fruits as $fruit){
    foreach($chunks as $letters){
        if(in_array(strtoupper($fruit[0]),$letters)){  // check if captialized first letter exists in $letters array
            $groups[implode($letters)][]=$fruit;  // push value into this group
            break;  // go to next fruit/value
        }
    }
}
var_export($groups);

Code#2将apokryfos非常聪明的ord()行与Code#1集成在一起,以消除内部循环(和内部循环本身)的不匹配迭代.这样可以提高效率,但会对可读性产生负面影响.

$fruits=array("date","guava","lemon","Orange","kiwi","Banana","apple");
natcasesort($fruits);  // pre-sort them for alphabetized output
$size=3;  // <-modify group sizes here
$chunks=array_chunk(range('A','Z'),$size);  // 0=>["A","B","C"],1=>["D","E","F"],etc...
foreach($fruits as $fruit){
    $groups[implode($chunks[floor((ord(strtoupper($fruit[0]))-ord("A"))/$size)])][]=$fruit;
}
var_export($groups);

Code#3通过使用preg_match_all()和某些过滤功能将值作为csv字符串处理.假设没有值包含逗号.我认为,由于所有功能和非常长的正则表达式模式,很难一眼就理解该代码.

$fruits=array("date","guava","lemon","Orange","kiwi","Banana","apple");
natcasesort($fruits);  // pre-sort them for alphabetized output  // array(6 => 'apple',5 => 'Banana',0 => 'date',1 => 'guava',4 => 'kiwi',2 => 'lemon',3 => 'Orange')
$size=3;  // <-modify group sizes here
$chunks=str_split(implode(range('A','Z')),$size);  // ['ABC','DEF','GHI','JKL','MNO','PQR','STU','VWX','YZ']
$regex="/((?<=^|,)[".implode('][^,]*)|((?<=^|,)[',$chunks)."][^,]*)/i";  // '/((?<=^|,)[ABC][^,]*)|((?<=^|,)[DEF][^,]*)|((?<=^|,)[GHI][^,]*)|((?<=^|,)[JKL][^,]*)|((?<=^|,)[MNO][^,]*)|((?<=^|,)[PQR][^,]*)|((?<=^|,)[STU][^,]*)|((?<=^|,)[VWX][^,]*)|((?<=^|,)[YZ][^,]*)/i'
if(preg_match_all($regex,implode(",",$fruits),$out)){
    $groups=array_map('array_values',   // 0-index subarray elements
        array_filter(                   // omit empty subarrays
            array_map('array_filter',   // omit empty subarray elements
                array_combine($chunks,  // use $chunks as keys for $out
                    array_slice($out,1) // remove fullstring subarray from $out
                )
            )
        )
    );
    var_export($groups);
}

代码#4通过使用array_map(),preg_grep(),array_values(),array_combine()和array_filter将这些值作为没有循环或条件的数组进行处理,以形成一个单行*打折$size& $chunks声明. …我不喜欢停下来,直到我制作出单线纸-无论多么难看.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...