【问题标题】:PHP Sorting of mutidimensional array based on more than one key valuesPHP基于多个键值对多维数组进行排序
【发布时间】:2014-03-17 16:20:46
【问题描述】:

我想根据“距离”值对多维数组进行排序。如果距离相等,那么我必须比较“创建”日期,然后是价格,最后是字母顺序。我可以根据不同的键值对数组进行排序。

$array = array(0 => array('title'=>'title1', 'distance'=>200, 'date'=>'2014-16','price'=>12), 1 = > 数组('title'=>'title2', 'distances'=>100, 'date'=>'014-03-15','price'=>17));

数组看起来像这样。首先是distnce然后是日期等等

【问题讨论】:

  • 签出usort并编写自己的排序函数。
  • 我们需要查看代码来修复代码。发布您的数组结构。到目前为止你尝试过什么?
  • $array = array( 0 => array('title'=>'title1', 'distance'=>200, 'date'=>'2014-03-16','price' =>12), 1 => 数组('title'=>'title2', 'distances'=>100, 'date'=>'014-03-15','price'=>17), );数组看起来像这样。优先考虑距离然后日期等等
  • @user3398902 在原始问题中添加您的附加上下文,而不是在 cmets 中。

标签: php


【解决方案1】:

我为这个确切的东西写了一个函数,

查看我的要点:
https://gist.github.com/chazmead/8829079

<?php
/**
 * Sort a 2 dimension array with values in the second dimension
 *
 * Developer: chazmead89@gmail.com  // @RaggaMuffin-4201
 * 
 * Order can be string of a field, which will default to asc
 * OR as array(field1,field2...fieldn) each defaulting to asc
 * OR as assoc array(field1 => dir[asc|desc], field2 => dir[asc|desc]...fieldn
 * => dir[asc|desc])
 *
 * PHP Sort constants can be used: SORT_ASC | SORT_DESC
 *
 * @param array $array array to sort - passed by reference
 * @param mixed $order
 * @return null
 */
function multisort(&$array,$order) {

    usort($array, function($a,$b) use ($order) {
      $sortMap = array('asc'=>SORT_ASC,'desc'=>SORT_DESC);

      $aObj = (object)$a;
      $bObj = (object)$b;

      if (is_string($order))
        $order = array($order);

      if (is_object($order))
        $order = (array)$order;

      $i = 0;
      $cOrder = count($order);

      foreach($order as $field => $dir) {
        if (is_numeric($field)) {
          $field = $dir;
          $dir = SORT_ASC;
        }

        // Goto next step when a mis-match is found.
        if ($aObj->$field != $bObj->$field)
          break;

        // All fields match return 0
        if (++$i === $cOrder)
          return 0;
      }

      if(!is_numeric($dir)) {
        $dir = strtolower($dir);
        $dir = $sortMap[$dir];
      }

      $d = ($dir === SORT_DESC) ? -1 : 1;
      $c = ($aObj->$field < $bObj->$field) ? -1 : 1;

      return $c*$d;
    });
}

可以这样使用:

$array = array( 0 => array('title'=>'title1', 'distance'=>200, 'date'=>'2014-03-16','price'=>12), 1 => array('title'=>'title2', 'distances'=>100, 'date'=>'014-03-15','price'=>17), );

$order = array('distance' => SORT_ASC, 'created' => SORT_ASC, 'title' => SORT_ASC);

multisort($array,$order);

【讨论】:

  • 如果它解决了您的问题,请不要忘记接受这是正确的;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
相关资源
最近更新 更多