gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:34:55 25 4
gpt4 key购买 nike

我是使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com