簡體   English   中英

對多維數組排序兩次

[英]sort multidimensional array twice

我已經按照從低到高的值距離對多維數組進行了排序。 這是輸出示例:(實際輸出大約有20或30個數組)。

數組(

[0] => Array
    (
        [id] => 1
        [distance] => 5
        [sponsor] => 0
    )

[1] => Array
    (
        [id] => 20
        [distance] => 8
        [sponsor] => 1 
    )

[2] => Array
    (
        [id] => 25
        [distance] => 10
        [sponsor] => 0 
    )

[3] => Array
    (
        [id] => 78
        [distance] => 25
        [sponsor] => 1 
    )

按從低到高的距離排序后,如果保薦人= 1,我想優先考慮。這是首選輸出:

數組(

[0] => Array
    (
        [id] => 20
        [distance] => 8
        [sponsor] => 1
    )

[1] => Array
    (
        [id] => 78
        [distance] => 25
        [sponsor] => 1 
    )

[2] => Array
    (
        [id] => 1
        [distance] => 5
        [sponsor] => 0 
    )

[3] => Array
    (
        [id] => 25
        [distance] => 10
        [sponsor] => 0 
    )

發起人是0或1。如何解決此問題? 我想到的是,在對距離進行排序之前,我應該根據發起人(0,1)將數組分成2個數組,對兩個數組進行按距離排序,然后在新的多維數組頂部將它們與Sponsor = 1合並。 這是這樣做的方法嗎?

謝謝您的意見。

這是usort建議的稍作修改的版本。 假設源數組稱為$ arr:

usort(
  $arr, function($a, $b) {
     if ( $a['sponsor'] == $b['sponsor'] ) {
        if ( $a['distance'] == $b['distance'] ) {
            return 0;
        }
        return $a['distance'] < $b['distance'] ? -1 : 1;
     }
     return $a['sponsor'] > $b['sponsor'] ? -1 : 1;
  }
);

您必須將原始數組拆分為2個數組:1st具有sponsor=1 1,2nd具有sponsor=0 然后將它們分別排序並合並。

像這樣:

$array1 = array_filter($array, function ($v) { return $v['sponsor'] == 1; });
$array2 = array_filter($array, function ($v) { return $v['sponsor'] == 0; });

function cmp($a, $b) {
    return $a['distance'] < $b['distance']? -1 : 1;
}

usort($array1, cmp);
usort($array2, cmp);
$result = array_merge($array1, $array2);

那會行得通,但是如果您使用穩定的排序算法,則可以先按距離排序,然后按贊助商降序排序,您將獲得所需的結果。

您可以使用array_multisort()函數來實現所需的功能:

<?php

$arr = [
    ['id' => 1, 'distance' => 5, 'sponsor' => 0],
    ['id' => 20, 'distance' => 8, 'sponsor' => 1],
    ['id' => 25, 'distance' => 10, 'sponsor' => 0],
    ['id' => 78, 'distance' => 25, 'sponsor' => 1],
];

$sponsor = array_column($arr, 'sponsor');
$distance  = array_column($arr, 'distance');

// rearrange $arr by sponsor DESC and then by distance ASC
array_multisort($sponsor, SORT_DESC, $distance, SORT_ASC, $arr);

print_r($arr);

嘗試這個 :

  <?php
   $ar = array(
   array("10", 11, 100, 100, "a"),
   array(   1,  2, "2",   3,   1)
   );
   array_multisort($ar[0], SORT_ASC, SORT_STRING,
   $ar[1], SORT_NUMERIC, SORT_DESC);
   var_dump($ar);
   ?> 

要么

  <?php
  $ar1 = array(10, 100, 100, 0);
  $ar2 = array(1, 3, 2, 4);
  array_multisort($ar1, $ar2);
  var_dump($ar1);
  var_dump($ar2);
  ?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM