【问题标题】:PHP multisort on array field containing underscore包含下划线的数组字段上的PHP多重排序
【发布时间】:2014-04-27 01:49:28
【问题描述】:

我有一个这样的数组:

$data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
$data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
$data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
$data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
$data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
$data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);

如何对 ALT_ID(N 到 P)和 bmi(从低到高)进行排序以获得这样的数组:

array (
array('ALT_ID' => '202143_N', 'bmi' => 2.5),
array('ALT_ID' => '202145_N', 'bmi' => 6.6),
array('ALT_ID' => '202147_N', 'bmi' => 7.6),
array('ALT_ID' => '202144_P', 'bmi' => 1.2),
array('ALT_ID' => '202146_P', 'bmi' => 3.6),
array('ALT_ID' => '202148_P', 'bmi' => 8.6)
)

这是我尝试过的,但它没有以所需的格式提供输出:

演示链接:https://eval.in/142639

<?php
$data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
$data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
$data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
$data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
$data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
$data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);

foreach ($data as $key => $row) {
    $volume[$key]  = $row['ALT_ID'];
    $bmi[$key] = $row['bmi'];
}

array_multisort($volume, SORT_ASC, SORT_STRING, $bmi, SORT_ASC, $data);

print_r($data);
?>

谢谢。

【问题讨论】:

    标签: php arrays substring delimiter array-multisort


    【解决方案1】:

    使用usort() 会更容易:

    $data = array();
    $data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
    $data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
    $data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
    $data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
    $data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
    $data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);
    
    usort($data, function($a, $b){
    $x = substr(strrchr($a['ALT_ID'], '_'), 1);
    $y = substr(strrchr($b['ALT_ID'], '_'), 1);
    if($x == $y) return $a['bmi']-$b['bmi'];
    return strcmp($x, $y);
    });
    
    print_r($data);
    

    DEMO

    【讨论】:

      【解决方案2】:

      您需要将 ALT_ID 的最后一个字符添加到排序键。

      <?php
      
      $data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
      $data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
      $data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
      $data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
      $data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
      $data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);
      
      foreach ($data as $key => $row) {
          $pieces = explode('_',$row['ALT_ID']);
          $id_piece = $pieces[1];
          $volume[$key]  = $id_piece . $row['ALT_ID'];
          $edition[$key] = $row['bmi'];
      }
      
      //edit
      array_multisort($volume, SORT_ASC, $edition, SORT_DESC, $data);
      
      print_r($data);
      
      ?>
      

      【讨论】:

      • 应该是array_multisort($volume, SORT_ASC, $edition, SORT_DESC, $data);
      • 但是如果下划线后面还有更多的元素呢?
      • 更新为处理下划线后超过 1 个字符。
      • php 版本 5.3.10-1 ubuntu3.10 似乎存在一些问题。 Multisort 不适用于大型数组。它正在对一个字段进行排序。
      猜你喜欢
      • 2015-11-19
      • 2013-09-01
      • 2016-05-10
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多