簡體   English   中英

按列中的值對多維數組進行排序

[英]Sort a multidimensional array by values in a column

我有這個數組

Array
(
    [0] => Array
        (
            [brand] => blah blah
            [location] => blah blah
            [address] => blah blah
            [city] => blah blah
            [state] => CA
            [zip] => 90210
            [country] => USA
            [phone] => 555-1212
            [long] => -111
            [lat] => 34
            [distance] => 3.08
        )
    [1] => Array
        (
            [brand] => blah blah
            [location] => blah blah
            [address] => blah blah
            [city] => blah blah
            [state] => CA
            [zip] => 90210
            [country] => USA
            [phone] => 555-1212
            [long] => -111
            [lat] => 34
            [distance] => 5
        )
.
.
.

}

我希望能夠按距離對散列中的數組進行排序。

您需要先提取所有距離,然后將距離和數據都傳遞給函數。 array_multisort文檔中的示例 3 所示。

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

array_multisort($distance, SORT_ASC, $data);

這假設您首先想要最短距離,否則將SORT_ASC更改為SORT_DESC

如果你想避免循環,你可以使用array_column函數來實現你的目標。 例如,

您想使用距離排序在數組下方進行排序

$arr = array( 
  0 => array( 'lat' => 34, 'distance' => 332.08 ),
  1 => array( 'lat' => 34, 'distance' => 5 ),
  2 => array( 'lat' => 34, 'distance' => 34 )
);

使用下面的單行,您的數組將按距離排序

array_multisort( array_column( $arr, 'distance' ), SORT_ASC, SORT_NUMERIC, $arr );

現在, $arr包含距離排序的數組

使用可以使用usort

function cmpDistance($a, $b) {
    return ($a['distance'] - $b['distance']);
}

usort($array, "cmpDistance");

此代碼有助於使用array_multisort()對多維數組進行排序

  $param_dt = array();
  foreach ($data_set as $key => $row) {
     if(isset($row['params']['priority']))
     {
       $param_dt[$key] = $row['params']['priority'];
     }
     else
     {
        $param_dt[$key] = -2; // if priority key is not set for this array - it first out
     }
    }

  array_multisort($param_dt, SORT_ASC,SORT_NUMERIC, $data_set); 

現在$data_set有元素的排序列表。

我們有一個行數組,但是 array_multisort() 需要一個列數組,所以我們使用下面的代碼來獲取列,然后執行排序。

// as of PHP 5.5.0 you can use array_column() instead of the above code
$brand= array_column($data, 'brand');
$city= array_column($data, 'city');

// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
array_multisort($brand, SORT_DESC, $city, SORT_ASC, $data);

調用usort()而不是array_multisort()的優點是您不需要預先迭代輸入數組來生成列數據數組。

下面的單行將使用PHP7.4的箭頭函數語法和PHP7的“飛船操作符”/“三向比較操作符”根據距離列值對輸入數組(按引用)進行排序。

隨着$a對左側<=>$b右側,使用升序。 要實現降序排序,請編寫$b['distance'] <=> $a['distance']

代碼:

usort($array, fn($a, $b) => $a['distance'] <=> $b['distance']);

var_export($array);

要在排序時打破關系,您可以聲明多個值以通過值數組進行排序。

以下將按以下順序排序:

  1. 距離 ASC 然后
  2. 國家 DESC 然后
  3. 狀態 ASC 然后
  4. 城市ASC

代碼:

usort(
    $array,
    fn($a, $b) =>
        [$a['distance'], $b['country'], $a['state'], $a['city']]
        <=>
        [$b['distance'], $a['country'], $b['state'], $b['city']]
);

暫無
暫無

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

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