php - 如何处理带有数组的对象以访问特定数据?

标签 php arrays oop object foreach

我是使用PHP中的对象的新手。我有一个带有print_r输出的JSON对象,看起来像这样(请参见下文)。我已经对其进行了编辑以缩短它,但这是它的结构:

stdClass Object
(
    [STATION_2CHAR] => ST
    [STATIONNAME] => Summit
    [ITEMS] => stdClass Object
        (
            [ITEM] => Array
                (
                    [0] => stdClass Object
                        (
                            [ITEM_INDEX] => 0
                            [SCHED_DEP_DATE] => 07:55:00 08/02/2013
                            [DESTINATION] => Dover
                            [TRACK] => 1
                            [LINE] => M&E
                            [TRAIN_ID] => 6607
                            [STATUS] => All Aboard
                            [SEC_LATE] => 322
                            [BACKCOLOR] => green
                            [FORECOLOR] => white
                            [SHADOWCOLOR] => black
                            [GPSLATITUDE] => 
                            [GPSLONGITUDE] => 
                            [GPSTIME] => 8/2/2013 7:59:37 AM
                            [TRAIN_LINE] => Morris & Essex Line
                            [STATION_POSITION] => 1
                            [LINEABBREVIATION] => M&E
                            [INLINEMSG] => 
                            [STOPS] => stdClass Object
                                (
                                    [STOP] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [NAME] => Chatham
                                                    [TIME] => 8/2/2013 8:05:31 AM
                                                )

                                            [1] => stdClass Object
                                                (
                                                    [NAME] => Madison
                                                    [TIME] => 8/2/2013 8:08:43 AM
                                                )

                                            [2] => stdClass Object
                                                (
                                                    [NAME] => Convent Station
                                                    [TIME] => 8/2/2013 8:12:56 AM
                                                )

                        ... etc
                                        )

                                )

                        )

                    [1] => stdClass Object
                        (
                            [ITEM_INDEX] => 1
                            [SCHED_DEP_DATE] => 08:07:00 08/02/2013
                            [DESTINATION] => Hoboken
                            [TRACK] => 2
                            [LINE] => M&E
                            [TRAIN_ID] => 414
                            [STATUS] => in 8 Min
                            [SEC_LATE] => 81
                            [BACKCOLOR] => lightgreen
                            [FORECOLOR] => black
                            [SHADOWCOLOR] => lightgreen
                            [GPSLATITUDE] => 40.6951
                            [GPSLONGITUDE] => -74.4034
                            [GPSTIME] => 8/2/2013 7:59:59 AM
                            [TRAIN_LINE] => Gladstone Branch
                            [STATION_POSITION] => 1
                            [LINEABBREVIATION] => M&E
                            [INLINEMSG] => 
                            [STOPS] => stdClass Object
                                (
                                    [STOP] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [NAME] => Maplewood
                                                    [TIME] => 8/2/2013 8:14:53 AM
                                                )

                                            [1] => stdClass Object
                                                (
                                                    [NAME] => South Orange
... etc

这是我用来访问此数据的PHP编码方法的类型。我想知道是否有更好的方法,因为必须“foreach”循环遍历才能获得所需的东西,这变得很复杂。我对PHP中的对象有印象,我将能够更直接地访问数据。

这是我写的一些PHP代码。到目前为止,它是一个函数,尽管它已经通过我的单元测试工作了,但是我觉得有一种更好的方法可以做到这一点,从而使编程更加优雅。该函数具有两个嵌套的foreach循环和三个“if”语句。对于我来说,找到旅行的连接时间似乎很多。
// $trip is the Object from the above data sample.
function get_connection($trip,$final_desired_dest,$connection_time) {

foreach ($trip as $st_key=>$st_ny_trip) {

$xfer_depart_time = $st_ny_trip->SCHED_DEP_DATE;


if ($st_ny_trip->STOPS->STOP instanceof stdClass)
{
    $st_ny_trip->STOPS->STOP = array($st_ny_trip->STOPS->STOP);
}

foreach ($st_ny_trip->STOPS->STOP as $key=>$value) {

    if ($value->NAME == $final_desired_dest ) {
        $connect_raw = DateTime::createFromFormat("m/d/Y g:i:s a", $connection_time);
        $xfer_depart_raw = DateTime::createFromFormat("H:i:s m/d/Y", $xfer_depart_time);
        $final_raw = DateTime::createFromFormat("m/d/Y g:i:s a", $value->TIME);

        if ($xfer_depart_raw > $connect_raw) {
            $xfer = $xfer_depart_raw->format("m/d/Y g:i:s a");
            $final = $final_raw->format("m/d/Y g:i:s a");
            return array ($xfer,$final);
        } // if (second)
    } // if (first)
}
} // foreach (first)
    return array ("","");
} // function end

我正在寻找一种更好的方法来对此进行改进。我可能在这里大大忽略了如何充分利用对象和OO编程,因此我希望能为您提供启发。谢谢!

最佳答案

开始使用对象和数组的方法是将对象用于的东西,将数组用于的列表,将(0,1,很多很多)列表中的东西。过于简单化,但这可以使事情开始。当您对对象进行一次编码并经常使用时,对象可以回答有关自身的问题(此火车在X处停止吗?)时,这些对象特别有用。

由于您的对象使用JSON并显示了print_r,因此我假设您可以将原始数据转换为所需的任何格式。您显示的格式具有一些额外的字段,这些字段对于数据交换是必需的,但是在编程中使用它时可能是多余的。我建议删除无用的字段/级别(例如STOPS中的STOP),并将列表转换为数组,将其他项转换为对象。

我将数据强行插入了我将在下面使用的结构。它允许这样的代码:

    $oScheduleDeparture = generate_scheduled_departure_1();
    $oStation = generate_station();

    print_r($oScheduleDeparture->getConnection('Madison', '3/4/2013 3:14:00 AM'));
    print_r($oStation->goesToDestination('Hoboken'));
    print_r($oStation->getConnections('Madison', '3/4/2013 3:14:00 AM'));

您应该能够编写一个解析器,将原始数据转换成类似的东西。希望能帮助到你!

类(class)站{

公共(public)功能goToDestination($ destination){
$ aReturn = array();
foreach($ this-> ITEMS as $ oScheduledDeparture){
如果($ oScheduledDeparture-> goesToStation($ destination)){
$ aReturn [] = $ oScheduledDeparture;
}
}
返回$ aReturn;
}

公共(public)功能getConnections($ destination,$ connection_time){
$ aReturn = array();
foreach($ this-> ITEMS as $ oScheduledDeparture){
如果($ oScheduledDeparture-> goesToStation($ destination)){
$ aReturn [] = array(
'SCHED_DEP_DATE'=> $ oScheduledDeparture-> SCHED_DEP_DATE,
'DESTINATION'=> $ oScheduledDeparture-> DESTINATION,
'连接'=> $ oScheduledDeparture-> getConnection($ destination,$ connection_time),
);
}
}
返回$ aReturn;
}

}

函数generate_station(){

$ aStation =数组(
STATION_2CHAR =>'ST',
STATIONNAME =>'Summit',
);

$ oStation =新的Station();
foreach($ aItem as $ key => $ value){
$ oStation-> $ key = $ value;
}

$ oStation-> ITEMS = array(
generate_scheduled_departure_0(),
generate_scheduled_departure_1(),
);
返回$ oStation;
}

class ScheduledDeparture {

公共(public)函数getScheduledDepartureTime(){
返回$ this-> SCHED_DEP_DATE;
}

公共(public)功能goToStation($ destination){
如果($ this-> DESTINATION == $ destination){
返回true;
}

//检查停靠点
foreach($ this-> STOPS as $ STOP){
如果($ STOP-> NAME == $ destination){
返回true;
}
}
返回false;
}

公共(public)功能getConnection($ destination,$ connection_time){
$ connect_raw = DateTime::createFromFormat(“m/d/Y g:i:s a”,$ connection_time);
$ xfer_depart_raw = DateTime::createFromFormat(“H:i:s m/d/Y”,$ this-> getScheduledDepartureTime());

foreach($ this-> STOPS as $ STOP){
如果($ STOP-> NAME == $ destination){
$ final_raw = DateTime::createFromFormat(“m/d/Y g:i:s a”,$ STOP-> TIME);

如果($ xfer_depart_raw> $ connect_raw){
$ xfer = $ xfer_depart_raw-> format(“m/d/Y g:i:s a”);
$ final = $ final_raw-> format(“m/d/Y g:i:s a”);
返回数组($ xfer,$ final);
}
}
}
//没有可用的连接
返回false;
}
}

函数generate_scheduled_departure_0(){
$ aItem = array(
'ITEM_INDEX'=>'0',
'SCHED_DEP_DATE'=> '07:55:00 08/02/2013',
'DESTINATION'=>'Dover',
'TRACK'=>'1',
'LINE'=>'M&E',
'TRAIN_ID'=>'6607',
'STATUS'=>'全部登机',
'SEC_LATE'=>'322',
'BACKCOLOR'=>'绿色',
'FORECOLOR'=>'白色',
'SHADOWCOLOR'=>'黑色',
'GPSLATITUDE'=>'',
'GPSLONGITUDE'=>'',
'GPSTIME'=>'2013年8月2日7:59:37 AM',
'TRAIN_LINE'=>'莫里斯和艾塞克斯专线',
'STATION_POSITION'=>'1',
'LINEABBREVIATION'=>'M&E',
'INLINEMSG'=>'',
);

$ oScheduleDeparture = new ScheduledDeparture();
foreach($ aItem as $ key => $ value){
$ oScheduleDeparture-> $ key = $ value;
}

$ oScheduleDeparture-> STOPS = generate_scheduled_departure_0_stops();
返回$ oScheduleDeparture;
}

函数generate_scheduled_departure_0_stops(){

$ aStops = array();

//
$ aStop =数组(
'NAME'=>'Chatham',
'TIME'=>'2013年8月2日8:05:31 AM',
);
$ aStops [] =(object)$ aStop;

$ aStop =数组(
'NAME'=>'Madison',
'TIME'=>'8/2/2013 8:08:43 AM',
);
$ aStops [] =(object)$ aStop;

$ aStop =数组(
'NAME'=>'修道院站',
'TIME'=>'8/2/2013 8:12:56 AM',
);
$ aStops [] =(object)$ aStop;

返回$ aStops;
}

//项目1
函数generate_scheduled_departure_1(){
$ aItem = array(
'ITEM_INDEX'=>'1',
'SCHED_DEP_DATE'=> '08:07:00 08/02/2013',
'DESTINATION'=>'Hoboken',
'TRACK'=>'2',
'LINE'=>'M&E',
'TRAIN_ID'=>'414',
'STATUS'=>'in 8 Min',
'SEC_LATE'=>'81',
'BACKCOLOR'=>'浅绿色',
'FORECOLOR'=>'黑色',
'SHADOWCOLOR'=>'浅绿色',
'GPSLATITUDE'=> '40 .6951',
'GPSLONGITUDE'=>'-74.4034',
'GPSTIME'=>'2013年8月2日7:59:59 AM',
'TRAIN_LINE'=>'格拉德斯通分支',
'STATION_POSITION'=>'1',
'LINEABBREVIATION'=>'M&E',
'INLINEMSG'=>'',
);

$ oScheduleDeparture = new ScheduledDeparture();
foreach($ aItem as $ key => $ value){
$ oScheduleDeparture-> $ key = $ value;
}

$ oScheduleDeparture-> STOPS = generate_scheduled_departure_1_stops();
返回$ oScheduleDeparture;
}

函数generate_scheduled_departure_1_stops(){

$ aStops = array();

$ aStop =数组(
'NAME'=>'枫木',
'TIME'=>'2013年8月2日8:14:53 AM',
);
$ aStops [] =(object)$ aStop;

$ aStop =数组(
'NAME'=>'South Orange',
'TIME'=>'8/2/2013 8:08:43 AM',
);
$ aStops [] =(object)$ aStop;

$ aStop =数组(
'NAME'=>'修道院站',
'TIME'=>'2013/8/2 8:14:25',
);
$ aStops [] =(object)$ aStop;

返回$ aStops;
}

关于php - 如何处理带有数组的对象以访问特定数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18121941/

相关文章:

php - 更新声明无效

php - 将我的站点升级到 1.9.3.0 并出现错误 SQLSTATE[42S22] : Column not found: 1054 Unknown column 'catalog_product_entity_group_price.is_percent'

python - 通过 int 选择 numpy 数组轴

c++ - 如何在多个文件和类之间传递实例

javascript - 当我编辑 htaccess 时,CSS 和 JS 丢失了

php - 如何在php中的mysql查询中使用多个数据库名称作为变量

c++ - 使用 Char 数组的 ROT13 实现

javascript - 如何使用嵌套数组对象访问 d3 json 文件中的值

oop - 我应该如何在数据库和 OOP 中建模组关系?

javascript - 关于JavaScript中闭包/封装效率的问题