【问题标题】:sorting results in php array objects在 php 数组对象中排序结果
【发布时间】:2014-07-14 21:38:58
【问题描述】:

我正在做一个订票网站,它通过 PHP 中的 SOAP 请求获取 xml 结果。然后以 PHP 对象数组的形式返回结果。然后我使用 PHP 显示这些结果。在一个请求中,返回了 300 多个结果。所以我需要按价格构建一个节目:为最终用户提供从低到高或从高到低的选项。我对 PHP 数组对象的经验很少,有人可以建议我可以研究这种排序的选项吗?

我正在考虑将所有结果存储到数据库表中,然后使用 SELECT 查询进行排序,但是由于每天会有很多搜索,并且每次搜索都会产生至少 300 个条目,这会使数据库很快变得非常庞大。有没有办法将搜索临时存储在数据库中?

感谢您花时间阅读本文。如果有人不清楚上述问题,我很乐意提供任何进一步的解释。

这是我的数据示例:

Array ( 
  [0] => stdClass Object ( 
    [Id] => HS 
    [Code] => CAUMJM 
    [Status] => InstantConfirmation 
    [Price] => 87 
    [Tax] => 0 
    [SalePrice] => 0 
    [currency] => USD 
    [Type] => Guest Only 
    [guests] => Array ( 
      [0] => stdClass Object ( 
        [Category] => Standard for 1 guest 
        [number] => Array ( [0] => stdClass Object ( [Type] => A[age] => 30 ) ) 
        [totalRate] => 87 
        [ratesPerHour] => Array ( [0] => stdClass Object ( [date] => 2014-08-20 [amount] => 87 ) ) 
      ) 
    ) 
  )
)

【问题讨论】:

  • @AndyJones 感谢上述线程的链接,但我正在处理的数组比上面线程示例中的数组复杂得多。它在一个主对象数组中有许多子对象。像下面这样的东西,你能建议如何做到这一点吗?
  • 能否请您发布一个来自您的 SOAP 请求的单个结果的示例? (即print_r($result[0])
  • 对不起,我想在我的最后一条评论中发布,但它说得太长了,所以这里是
  • :Array ([0] => stdClass Object ([Id] => HS [Code] => CAUMJM [Status] => InstantConfirmation [Price] => 87 [Tax] => 0 [ SalePrice] => 0 [currency] => USD [Type] => Guest Only [guests] => Array ( [0] => stdClass Object ( [Category] ​​=> Standard for 1 guest [number] => Array ( [ 0] => stdClass 对象 ( [Type] => A[age] => 30 ) ) [totalRate] => 87 [ratesPerHour] => 数组 ( [0] => stdClass 对象 ( [date] => 2014-08 -20 [数量] => 87 ) ) ) ) ))

标签: php mysql arrays sorting


【解决方案1】:

尝试使用 usort。 PHP Documentation

提供您要排序的 php 数组和一个匿名函数,该函数将比较任意数组项中的两个项并确定哪个项应该在列表中排在第一位。

除非我错了,否则您似乎是从 3rd 方服务获取肥皂,在这种情况下,您将无法从数据库中查询结果。您可以将 usort 函数的结果存储在 apc 或 memcached 等内存存储中,而不是创建自己的本地数据库缓存。然后,计算量大的 usort 只需在每个查询中运行一次。这将显着加快排序结果的请求时间。

我提出的缓存建议有点离题,并不是获得您想要的结果所必需的。如果您有兴趣,请查看它们,但我会尽力将您带到您需要首先到达的地方。

就你的 usort 实现而言,尝试这样的事情:

    $lowToHigh = function($a, $b) {
        return  $a->SalePrice < $b->SalePrice ? 1 : -1;
    };

    $highToLow = function($a, $b) {
        return  $a->SalePrice < $b->SalePrice ? -1 : 1;
    };

    // Sort results highest to lowest
    usort($results, $highToLow);
    // Sort results lowest to highest
    usort($results, $lowToHigh);

【讨论】:

  • 嗨@user695793,是的,你是对的,我正在从第三方获得结果。但结果是非常复杂的对象数组,我需要对其进行排序。我之前没有处理过 apc 或 memcache,所以不知道你在那里说了什么?
  • 检查我发布的新的排序实现。
  • 感谢您发布代码@user695793,但我收到此代码的语法错误“解析错误:语法错误,意外的 T_LNUMBER”行“return $a->SalePrice SalePrice 1 : -1;"
  • 效果很好,但是你把
【解决方案2】:

sql order by 是更好的选择。 php 数组在更大的数组上很昂贵

对于 php 中的数组排序,请查看这些方法

http://php.net/manual/en/array.sorting.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2012-07-11
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多