[英]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);
要在排序時打破關系,您可以聲明多個值以通過值數組進行排序。
以下將按以下順序排序:
代碼:
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.