如何使用字母范围按值对数组进行分组

时间:2019-12-03 16:41:30

标签: php arrays codeigniter grouping

如何根据字母范围将具有相同值的数组分组, 我有一个像这样的数组。

$arr = array('HIGH','HIGH','HIGH','HIGH','LOW','LOW','LOW'
             ,'MEDIUM','MEDIUM');
$alpabet = range('a','z');

foreach ($arr as $key => $val){
    echo $alpabet[$key].' - '.$val."</br>";
}

此代码的结果

a - HIGH
b - HIGH
c - HIGH
d - HIGH
e - LOW
f - LOW
g - LOW
h - MEDIUM
i - MEDIUM

如何获得这样的结果

a - HIGH
a - HIGH
a - HIGH
a - HIGH
b - LOW
b - LOW
b - LOW
c - MEDIUM
c - MEDIUM

3 个答案:

答案 0 :(得分:0)

您可以使用以下代码进行操作:

$prev_value = ''; // you need it to check for new values
$alphabet_range_index = -1; // every new value you increment this index

foreach ($arr as $key => $val) {
    if ($val != $prev_value) {
        // every new value you increment the alphabet index
        $alphabet_range_index++;
        $prev_value = $val;
    }
    echo $alpabet[$alphabet_range_index].' - '.$val."</br>";
}

答案 1 :(得分:0)

您可以使用以下魔术循环:

$tmp = [];
$i = -1;
foreach ($arr as $val){
    $tmp[$val] = empty($tmp[$val]) ? $alpabet[++$i] : $tmp[$val];
    echo $tmp[$val].' - '.$val.PHP_EOL;  
}

Demo

输出:

a - HIGH
a - HIGH
a - HIGH
a - HIGH
b - LOW
b - LOW
b - LOW
c - MEDIUM
c - MEDIUM

答案 2 :(得分:0)

一种可能性是创建从$arr$alphabet中的键的值映射。

$map = array_flip(array_values(array_unique($arr)));

(这会给您$map = ['HIGH' => 0, 'LOW' => 1, 'MEDIUM' => 2]

然后,您可以在循环中使用它来将$arr中的值与$alphabet中的值进行匹配。

echo $alpabet[$map[$val]].' - '.$val."</br>";

一种类似的方法是将$arr中的值直接映射到字母。

$unique = array_unique($arr);
$map = array_combine($unique, array_slice($alphabet, 0, count($unique)));

这将为您提供$map = ['HIGH' => 'a', 'LOW' => 'b', 'MEDIUM' => 'c'],您可以在循环中使用它,例如

echo $map[$val].' - '.$val."</br>";

这个想法对起始数组和目标做了一些假设,问题在这方面不是太具体,因此可能无法满足您的需求。在某些情况下,它仍然可能有效。