猿问

如何根据PHP中给定键的值对关联数组进行排序?

如何根据PHP中给定键的值对关联数组进行排序?

给定这个数组:

$inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),);

我想排序$inventory按价格划分的要素得到:

$inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),);

我该怎么做?


宝慕林4294392
浏览 677回答 3
3回答

MYYA

你说得对,你要找的是array_multisort().下面是一个从手册中直接摘录并适应于您的案例的例子:$price = array();foreach ($inventory as $key => $row){     $price[$key] = $row['price'];}array_multisort($price, SORT_DESC, $inventory);从PHP5.5.0开始,您可以使用Array_Column()代替这个foreach$price = array_column($inventory, 'price');array_multisort($price, SORT_DESC, $inventory);

湖上湖

PHP 7+从PHP 7开始,可以使用usort带着匿名函数使用宇宙飞船操作员来比较元素。您可以这样进行升序排序:usort($inventory,&nbsp;function&nbsp;($item1,&nbsp;$item2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$item1['price']&nbsp;<=>&nbsp;$item2['price'];});或者像这样的下降类型:usort($inventory,&nbsp;function&nbsp;($item1,&nbsp;$item2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$item2['price']&nbsp;<=>&nbsp;$item1['price'];});要了解这是如何工作的,请注意usort接受用户提供的比较函数,其行为必须如下(来自docs):如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于或大于零的整数。还要注意<=>太空船操作员,如果两个操作数相等,则返回0,如果左大于1,则返回-1,如果右侧较大,则返回-1。这正是usort需要。事实上,几乎所有添加<=>的语言https:/wiki.php.net/rfc/组合-比较-操作符是这样吗?使编写顺序回调用于usort()更容易PHP 5.3+PHP 5.3引入了匿名函数,但还没有太空船运算符。我们还可以用usort排序我们的数组,但它更冗长,更难理解:usort($inventory,&nbsp;function&nbsp;($item1,&nbsp;$item2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($item1['price']&nbsp;==&nbsp;$item2['price'])&nbsp;return&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$item1['price']&nbsp;<&nbsp;$item2['price']&nbsp;?&nbsp;-1&nbsp;:&nbsp;1;});注意,虽然处理整数值的比较器通常只返回值的差异,但如下$item2['price'] - $item1['price'],我们不能在这种情况下可以安全地做到这一点。这是因为在问询者的例子中,价格是浮点数,但是我们传递给的比较函数。usort必须返回整数usort正常工作:回归非整数比较函数(如Float)中的值将导致回调返回值的内部强制转换为整数。因此,0.99和0.1这样的值都将转换为0的整数值,这将比较这些值是否相等。这是在使用usort在PHP 5.x中!我对这个答案的原稿我犯了这个错误,但我在数千次浏览中累积了10次,显然没有人注意到这个严重的错误。像我这样笨手笨脚的人容易搞砸比较器的功能精确更容易使用的太空船运算符被添加到PHP 7语言中的原因。

POPMUISE

而其他人则正确地建议使用array_multisort(),由于某些原因,似乎没有人承认array_column(),这可以大大简化解决方案。所以我的建议是:array_multisort(array_column($inventory,&nbsp;'price'),&nbsp;SORT_DESC,&nbsp;$inventory);
随时随地看视频慕课网APP
我要回答