编程语言
首页 > 编程语言> > 排序对象(SimpleXMLElement)php

排序对象(SimpleXMLElement)php

作者:互联网

我正在尝试从SimpleXMLElement中找到一种对数组进行排序的方法.我想按照从event_start_dt获得的开始时间排序.我还想按房间ID排序作为一个单独的过程.目前,数组按对象顺序排列(SimpleXMLElement)#.这是var_dump($array):

    object(SimpleXMLElement)#275 (1) { 
["reservation"]=> array(3) 
    { 
    [0]=> object(SimpleXMLElement)#287 (28) { 
        ["reservation_id"]=> string(7) "8644894" 
        ["event_start_dt"]=> string(25) "2013-12-02T12:00:00-08:00" 
        ["event_end_dt"]=> string(25) "2013-12-02T13:00:00-08:00" 
        ["event_id"]=> string(6) "314147" 
        ["event_name"]=> string(24) "Practice" 
        ["room_id"]=> string(3) "202"
    }
    [1]=> object(SimpleXMLElement)#288 (28) { 
        ["reservation_id"]=> string(7) "8595185" 
        ["event_start_dt"]=> string(25) "2013-12-02T08:00:00-08:00" 
        ["event_end_dt"]=> string(25) "2013-12-02T09:00:00-08:00" 
        ["event_id"]=> string(6) "314005"
        ["event_name"]=> string(24) "Meeting" 
        ["room_id"]=> string(3) "207"
    }
    [2]=> object(SimpleXMLElement)#289 (28) { 
        ["reservation_id"]=> string(7) "8718654" 
        ["event_start_dt"]=> string(25) "2013-12-02T10:00:00-08:00" 
        ["event_end_dt"]=> string(25) "2013-12-02T11:00:00-08:00" 
        ["event_id"]=> string(6) "315811" 
        ["event_name"]=> string(20) "Maintenance" 
        ["room_id"]=> string(3) "202"
    }
} }

我尝试过usort和asort,但还没有使用任何一种方法.

使用方法:

function sortByTime($a, $b){
    $a = strtotime($array->event_start_dt);
    $b = strtotime($array->event_start_dt);
        if ($a==$b) return 0;
        return ($a < $b) ?-1 : 1;
        }

        usort($arrTimes, 'sortByTime');

        var_dump($arrTimes);

尝试下面的代码给我警告:usort()期望参数1是数组,给定对象.

foreach ($rez->reservation as $value){ 
    $var1 = $value->space_reservation->space_name;
    $var2 = substr($value->event_start_dt,11,5);
}
sort_obj_arr($value,$var1,SORT_DESC);

echo "<pre>SORTED ";
print_r($value);
echo "</pre>";

function sort_obj_arr(& $arr, $sort_field, $sort_direction)
{
    $sort_func = function($obj_1, $obj_2) use ($sort_field, &$sort_direction)
    {
        if ($sort_direction == SORT_ASC) {
            return strnatcasecmp($obj_1->$sort_field, $obj_2->$sort_field);
        } else {
            return strnatcasecmp($obj_2->$sort_field, $obj_1->$sort_field);
        }
    };
    usort($arr, $sort_func);

}

我有一个来自我的控制器的阵列,但不能让我们工作:
我得到:usort()期望参数1是数组,给定对象或null.

$array = array($this->data);
print_r($array);

array(1) { 
[0]=> object(SimpleXMLElement)#280 (1) { ["reservation"]=> array(3) { 
        [0]=> object(SimpleXMLElement)#287 (28) { 
            ["reservation_id"]=> string(7) "8644894" 
            ["event_start_dt"]=> string(25) "2013-12-02T12:00:00-08:00" 
            ["event_end_dt"]=> string(25) "2013-12-02T13:00:00-08:00" 
            ["event_id"]=> string(6) "314147" 
            ["event_name"]=> string(24) "Practice" 
            ["room_id"]=> string(3) "202"
        }
        [1]=> object(SimpleXMLElement)#288 (28) { 
            ["reservation_id"]=> string(7) "8595185" 
            ["event_start_dt"]=> string(25) "2013-12-02T08:00:00-08:00" 
            ["event_end_dt"]=> string(25) "2013-12-02T09:00:00-08:00" 
            ["event_id"]=> string(6) "314005"
            ["event_name"]=> string(24) "Meeting" 
            ["room_id"]=> string(3) "207"
        }
        [2]=> object(SimpleXMLElement)#289 (28) { 
            ["reservation_id"]=> string(7) "8718654" 
            ["event_start_dt"]=> string(25) "2013-12-02T10:00:00-08:00" 
            ["event_end_dt"]=> string(25) "2013-12-02T11:00:00-08:00" 
            ["event_id"]=> string(6) "315811" 
            ["event_name"]=> string(20) "Maintenance" 
            ["room_id"]=> string(3) "202"
        }
    } }

请求print_r:

SimpleXMLElement Object
(
    [reservation] => Array(3)
        (
            [0] => SimpleXMLElement Object
                (
                    [reservation_id] => 8604174
                    [event_start_dt] => 2013-12-31T06:00:00-08:00
                    [event_end_dt] => 2013-12-31T08:00:00-08:00
                    [event_id] => 314147
                    [event_name] => Practice
                    [room_id] => 202
                 )
         [1] => SimpleXMLElement Object
                (
                    [reservation_id] => 8604177
                    [event_start_dt] => 2013-12-31T05:00:00-08:00
                    [event_end_dt] => 2013-12-31T06:00:00-08:00
                    [event_id] => 314150
                    [event_name] => Meeting
                    [room_id] => 216
                 )
         [2] => SimpleXMLElement Object
                (
                    [reservation_id] => 8604189
                    [event_start_dt] => 2013-12-31T10:00:00-08:00
                    [event_end_dt] => 2013-12-31T11:00:00-08:00
                    [event_id] => 314150
                    [event_name] => Maintenance
                    [room_id] => 220
                 )
)
)

$arrTimes = xml2array($array->reservation);

var_dump($arrTimes)

array(5) { 
["reservation_id"]=> string(7) "8604175" 
["event_start_dt"]=> string(25) "2014-01-02T06:00:00-08:00" 
["event_end_dt"]=> string(25) "2014-01-02T08:00:00-08:00" 
["event_id"]=> string(6) "314147" 
["event_name"]=> string(24) "Practice" 
}

解决方法:

在对数据进行排序之前,需要创建一个数组,其中包含要排序的单独项目作为其值.从您的调试输出,这些是多个< reservation>输入XML中的节点,这些元素的子元素由$array / $this->表示这些样本中的数据(如果它是文档的根,则无关紧要,SimpleXML没有Document对象).

你的print_r和var_dump输出显示你当前没有这样的数组,只有一个SimpleXML对象:

>您的第一个示例显示了var_dump($array)给出输出开始对象(SimpleXMLElement)#275(1){ – 进一步忽略单词数组,这就是var_dump如何呈现对象的内部.
>稍后,你有一个print_r($array);开始数组(1){ – 但这只是因为你把真实数据包装在上面一行的单元素数组中($array = array($this-> data);)和那个元素($array [0])显示为对象(SimpleXMLElement)#280(1){….

请注意,没有必要进一步将所有内部SimpleXML对象转换为数组 – 您只需要一个可排序的列表,其中包含您感兴趣的项目.我个人会使用一个简单明确的foreach循环,以获得最大的代码可读性虽然可以使用“聪明”的解决方案.

一旦有了可排序列表,就需要一个usort的回调函数来比较它的两个参数.你所做的尝试是沿着正确的方向,但是指的是不存在的(在那个函数中)变量$array;你需要比较的值是函数的参数,你称之为$a和$b – 具体来说,你想比较strtotime($a-> event_start_dt)和strtotime($b-> event_start_dt).

你也可以使函数更简单,因为它遵循常见的误解,即回调的返回值应该是-1,0或1.实际上,它可以是任何整数,只有它的符号很重要 – 返回-42与返回-999具有相同的效果,即在结果数组中将$a放在$b之前.

我不能轻易提供一个经过测试的示例,因为您没有提供基础XML来重现您的输入(例如echo $this-> data-> asXML();),但我将采取的基本方法是这个:

// Start with an empty array, and add all the items we're interested in to it
$sortable_array = array();
// Loop over all <reservation> children of the SimpleXML object $this->data
// See http://php.net/manual/en/simplexml.examples-basic.php
foreach ( $this->data->reservation as $reservation_node )
{
    // Add the individual node to our array
    $sortable_array[] = $reservation_node;
}

// Now let's sort out the callback function for the sorting
// This could also be an anonymous function passed directly to usort
function sort_callback_event_start($a, $b)
{
    // $a and $b are both items in our $sortable_array, and therefore
    // <reservation> nodes which we expect to each have a child
    // called <event_start_dt>

    // If we convert both dates to Unix timestamps, we have two integers 
    // to compare, and a simple subtraction gives the desired result
    // of <0, 0, or >0 as documented at http://php.net/usort

    return
        strtotime((string)$a->event_start_dt)
        -
        strtotime((string)$b->event_start_dt);
}

// Now, we have everything we need to do the actual sorting
usort($sortable_array, 'sort_callback_event_start');
// $sortable_array is now sorted as desired! :D

// Note that the items within it are still SimpleXML objects, 
// so you still need to access their properties to do something useful
// e.g. some HTML output with the names listed in order of their start date:
echo '<ol>';
foreach ( $sortable_array as $reservation_node )
{
    echo '<li>', (string)$reservation_node->event_name, '</li>';
}
echo '</ol>';

标签:usort,php,sorting,simplexml
来源: https://codeday.me/bug/20191002/1845179.html