如何根据字母范围对具有相同值的数组进行分组, 我有一个这样的数组。
$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
您可以使用此魔术循环:
$tmp = [];
$i = -1;
foreach ($arr as $val){
$tmp[$val] = empty($tmp[$val]) ? $alpabet[++$i] : $tmp[$val];
echo $tmp[$val].' - '.$val.PHP_EOL;
}
演示
输出:
a - HIGH
a - HIGH
a - HIGH
a - HIGH
b - LOW
b - LOW
b - LOW
c - MEDIUM
c - MEDIUM
您可以使用以下代码执行此操作:
$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>";
}
一种可能性是在$alphabet
中创建从$arr
到键的值映射。
$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>";
这个想法对起始数组和目标做了一些假设,问题在这方面不是太具体,所以它可能无法满足您的需求。尽管如此,它在某些情况下可能有效。