繁体   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