【问题标题】:How to group array by value with alphabet range如何使用字母范围按值对数组进行分组
【发布时间】:2019-12-03 16:41:30
【问题描述】:

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

$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

【问题讨论】:

  • o.O 你是如何将这些字母与值关联起来的?

标签: php arrays codeigniter grouping


【解决方案1】:

你可以使用这个魔法循环:

$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】:

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

    $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>";
    }
    

    【讨论】:

      【解决方案3】:

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

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

      (这会给你$map = ['HIGH' =&gt; 0, 'LOW' =&gt; 1, 'MEDIUM' =&gt; 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' =&gt; 'a', 'LOW' =&gt; 'b', 'MEDIUM' =&gt; 'c'],你可以在循环中使用它

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2010-10-03
        • 2012-11-15
        • 1970-01-01
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多