【问题标题】:PHP order multi-dimensional array by three or more valuesPHP通过三个或更多值订购多维数组
【发布时间】:2015-12-21 17:19:23
【问题描述】:

我有一个这样的数组

array(
[0] => Array (
       [fullAddress] => 2482 Midvale St,Kettering, OH, 45420
       [bedrooms] => 3
       [bathrooms] => 1.0
       [sqft] => 1548
       [yearBuilt] => 1955
       [lastSoldDate] => 12/09/2015
       [lastSoldPrice] => 87,000
       [distance] => 0.59
       )
[1] => Array (
       [fullAddress] => 2828 Vale Dr, Dayton, OH, 45420
       [bedrooms] => 3
       [bathrooms] => 1.5 
       [sqft] => 1356 
       [yearBuilt] => 1956 
       [lastSoldDate] => 10/09/2015 
       [lastSoldPrice] => 117,500 
       [distance] => 0.38
) 
[2] => Array (
       [fullAddress] => 2812 Vale Dr, Dayton, OH, 45420 
       [bedrooms] => 4 
       [bathrooms] => 2.0 
       [sqft] => 1248 
       [yearBuilt] => 1955 
       [lastSoldDate] => 05/13/2015 
       [lastSoldPrice] => 114,900 
       [distance] => 0.33
 )
)

我需要订购:距离 asc,lastSoldPrice desc(最近日期到当前日期),最后按相同卧室、浴室和平方英尺订购,误差在 20% +- 以内。与这样的主要财产相比:

Array (
       [fullAddress] => 2400 Ghent Ave, Dayton, OH 45420
       [bedrooms] => 3 
       [bathrooms] => 1.0 
       [sqft] =>  984
       [yearBuilt] => 1956
       [lastSoldDate] => 05/06/2014 
       [lastSoldPrice] => 74,763
 )

所以前两个订单已经准备就绪,我可以使用 usort() 按距离和 lastsoldprice 进行订购,但我还没有拿到最后一个,因为我不知道如何与另一个数组(主要属性)进行比较。

这是我与 usort 一起使用的代码

function sort($a, $b) {
    if ($a['distance']==$b['distance']) {
        if ($a['lastSoldDate']==$b['lastSoldDate']) {
           return 0;
        } else {
            return ($a['lastSoldDate']<$b['lastSoldDate']) ? 1 : -1;
        }
    } else {
        return ($a['distance']>$b['distance']) ? 1 : -1;
    }
}

usort($propertydata, 'sort');

我希望有人可以帮助我。谢谢

【问题讨论】:

  • “在 20% + 或 - 以内”是什么意思?不适合该范围的房屋是否应该根本不显示?还是最后聚在一起?
  • 我忘记添加该信息,所以我编辑了问题。与具有相同数据的搜索地址相比,相同的卧室、浴室和平方英尺在 20% + 或 - 以内。这将是最后一个优先排序。
  • 嗯,我不确定这是否能回答我的问题。也许您可以在您的问题中添加“具有相同数据的搜索地址”,以及您希望结果的顺序?
  • 您可以使用array_multisort - 然后也许使用Closure 来实现距离公式?

标签: php arrays sorting usort


【解决方案1】:

为此,您需要首先按平方英尺对数组进行排序,然后按距离和最后售价进行排序。

像这样

function sort1($a, $b) {
    if ($a['bedrooms']!=$b['bedrooms'] || $a['bathrooms']!=$b['bathrooms'] || $a['sqft']==$b['sqft']) {
       return 0;
    } else {
        return (abs($a['sqft']-$b['sqft'])<$a['sqft']*.2) ? -1 : 1;
    }
}


function sort2($a, $b) {
    if ($a['distance']==$b['distance']) {
        if ($a['lastSoldDate']==$b['lastSoldDate']) {
           return 0;
        } else {
            return ($a['lastSoldDate']<$b['lastSoldDate']) ? 1 : -1;
        }
    } else {
        return ($a['distance']>$b['distance']) ? 1 : -1;
    }
}

usort($propertydata, 'sort1');
usort($propertydata, 'sort2');

【讨论】:

  • 感谢您的回答,但首先,sort1 函数还应该比较床和浴室?
  • @DanielDuque 查看编辑。现在第一个排序算法忽略了具有不同床/浴室的那些属性。请注意,您可能需要对此进行修改以使其完美,但拥有两种或更多种类可能是您需要进入的方向。
  • 谢谢,我会试试看,有任何进展都会告诉你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2021-03-05
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多