[英]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.