【问题标题】:PHP: assign priority to array values and then sort by that priorityPHP:为数组值分配优先级,然后按该优先级排序
【发布时间】:2014-01-29 00:07:27
【问题描述】:

有没有办法在 PHP 中为数组分配“优先级分数”?然后根据该优先级进行排序。鉴于我的意见:

Array(
  [princeton] => Princeton
  [stanford] => Stanford
  [yale] => Yale
  [mit] => MIT
  [harvard] => Harvard 
)

我希望输出始终在顶部有 HarvardYale,其余按字母顺序排序:

Array(
  [harvard] => Harvard
  [yale] => Yale
  [mit] => MIT
  [princeton] => Princeton
  [stanford] => Stanford    
)

我查看了按字母顺序排列的 asort() 和自定义定义的 uasort(),但我不知道如何“分配优先级”。任何帮助将不胜感激!

【问题讨论】:

  • 优先级从何而来?
  • 我会听他们的,只有一对,但我不知道如何分配。
  • 按字母顺序排序后删除和添加到顶部似乎微不足道
  • 使用uasort,您可以定义两个项目之间的排序。如果哈佛和耶鲁都不是,做一个strcmp,如果其中一个是,让它在另一个之前排序,如果两者都是,返回0(除非你希望哈佛总是在耶鲁之前排序,在这种情况下,你可以再次返回strcmp 当两者都是哈佛或耶鲁时)。

标签: php arrays sorting


【解决方案1】:

uasort 将通过您自己的比较函数对您的数组进行排序。我将函数放在哈佛或耶鲁前面(这两个的顺序将不确定,因为你没有指定),其余的按字母顺序排序。

function cmp($a, $b) {
    if ($a == 'Yale' || $a == 'Harvard') {
        return -1;
    } else if ($b == 'Yale' || $b == 'Harvard') {
        return 1;
    } else return strcmp($a, $b);
}

uasort($array, 'cmp');

【讨论】:

    【解决方案2】:

    假设你有类似的东西

    $priotities=array(
      [harvard] => 1
      [yale] => 2
      [mit] => 3
      [princeton] => 4
      [stanford] => 5
    )
    

    你可以

    $final=$priorites;
    sort(final);
    foreach ($final as $k=>$v) 
      $final[$k]=$universities[$k];
    

    【讨论】:

      【解决方案3】:

      也许你想多了。

      1. 按键排序
      2. 将您的短优先级数组替换为按字母顺序排列的数组

      代码:(Demo)

      $ivyLeaguers = [
        'princeton' => 'Princeton',
        'cornell' => 'Cornell',
        'stanford' => 'Stanford',
        'yale' => 'Yale',
        'mit' => 'MIT',
        'harvard' => 'Harvard'
      ];
      
      ksort($ivyLeaguers);
      var_export(
          array_replace(['harvard' => null, 'yale' => null], $ivyLeaguers)
      );
      

      输出:

      array (
        'harvard' => 'Harvard',
        'yale' => 'Yale',
        'cornell' => 'Cornell',
        'mit' => 'MIT',
        'princeton' => 'Princeton',
        'stanford' => 'Stanford',
      )
      

      null 值被覆盖,但它们的位置受到尊重。此技术根据匹配键将优先学校拉到列表顶部。

      【讨论】:

        猜你喜欢
        • 2018-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多