【问题标题】:using usort to re-arrange multi-dimension array [closed]使用 usort 重新排列多维数组 [关闭]
【发布时间】:2012-12-18 23:01:18
【问题描述】:

我有一个大数组(这只是其中的一部分):

[0] => stdClass Object
    (
        [products] => Array
            (
                [0] => stdClass Object
                    (
                        [body_html] => bodyhtml
                        [published_at] => 2012-12-16T23:59:18+00:00
                        [created_at] => 2012-12-16T11:30:24+00:00
                        [updated_at] => 2012-12-18T10:52:14+00:00
                        [vendor] => Name
                        [product_type] => type
                    )
                [1] => stdClass Object
                    (
                        [body_html] => bodyhtml
                        [published_at] => 2012-12-16T23:59:18+00:00
                        [created_at] => 2012-12-16T10:30:24+00:00
                        [updated_at] => 2012-12-18T10:52:14+00:00
                        [vendor] => Name
                        [product_type] => type
                    )
              )
      )

并且我需要在每个产品的创建日期之前安排它们... 我尝试过各种 usort、ksort、uksort 技术并尝试使其按特定顺序(按时间顺序)但失败了!

任何指导将不胜感激

【问题讨论】:

    标签: php arrays json usort


    【解决方案1】:

    您需要使用 uasort 函数,它可以让您指定一个简单的比较函数。有关详细信息,请参阅uasort。您还可以将匿名函数定义为 uasort 调用的一部分。由于您有一个带有数组的对象,因此请确保将对象的数组传递给 uasort 函数。由于您正在对一组对象进行排序,因此您的比较函数应该考虑到它正在处理 2 个对象。

    根据您的回复和您的 var_dump:

    uasort($foo[0]->products, function($a, $b) {
    
        if ($a->created_at < $b->created_at) {
            return -1;
        }
        return 1;
    });
    

    【讨论】:

    • 这就是我迷路的地方,我可以对单个数组执行此操作,但深入数组是我失败的地方......
    • “我可以对单个数组执行此操作,但更深入的数组是我失败的地方。”在这里给我们一点帮助。除了一组对象外,我什么也没看到。它恰好在一个对象内部,但这不应妨碍排序。我错过了什么吗?谢谢,~雷
    • 我正在努力处理数组中的数组,并从第二个数组中获取 created_at 数据,然后使用该数组组织所有产品...
    • 我更新了我的回复。在我的示例中,$foo 应该是您上面 var_dump'd 的任何变量。
    • 成功了!非常感谢gview,为我的描述道歉!
    【解决方案2】:

    这是一个例子:

    $arr_1 = array('name' => 'A', 
                   'date' => '2012-12-16T11:30:24+00:00' , 
                   'created_at' => '2012-12-16T11:30:24+00:00');
    $arr_2 = array('name' => 'B', 
                   'date' => '2012-12-16T11:30:22+00:00' , 
                   'created_at' => '2012-12-16T11:30:21+00:00');
    
    
    $test_array = array($arr_1, $arr_2);
    var_dump($test_array);
    
    usort($test_array, function($a, $b) {
        $a_date = new DateTime($a['date']);
        $b_date = new DateTime($b['date']);
        if ($a_date < $b_date) {
            return -1;
        }
        return 1;
    });
    
    var_dump($test_array);
    

    【讨论】:

    • 日期格式实际上被格式化为可以像字符串一样进行比较,较早的日期是“较小的”字符串。无需使用 DateTime 解析它们。
    • @Sven 好的。我明白了,这不是他的问题。这是他遇到问题的多维方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多