【问题标题】:Json extra fieldsJson 额外字段
【发布时间】:2015-07-17 15:14:27
【问题描述】:

我创建了这个工作代码,它将数据从 api 存储到 json 文件 基于昨天的日期。

$filedate = date('Y-m-d',strtotime("-1 days"));
    $yesterday = date('Y-m-d 00:00',strtotime("-1 days"));
    $today = date('Y-m-d 23:59',strtotime("-1 days"));

    try{

        $soccer=new XMLSoccer("API KEY");
        $soccer->setServiceUrl("http://www.xmlsoccer.com/FootballData.asmx");
        /*  $result=$soccer->GetLiveScore();*/
        $result=$soccer->GetFixturesByDateInterval(array( "startDateString"=> "$yesterday" ,"endDateString"=> "$today"));            
        var_dump($result);

        $fp = fopen( "/var/www/public_html/domain/$filedate.json","w+");
        fwrite($fp,json_encode($result));
        fclose($fp);
    }
    catch(XMLSoccerException $e){
        echo "XMLSoccerException: ".$e->getMessage();
    }

上面的代码将这个json数据存储在文件中:

{
Match: [
{
Id: "346528",
Date: "2015-07-15T12:00:00+00:00",
League: "Chinese Super League",
Round: "19",
HomeTeam: "Guangzhou Evergrande",
HomeTeam_Id: "1108",
HomeGoals: "0",
AwayTeam: "Henan Jianye",
AwayTeam_Id: "1100",
AwayGoals: "0",
Time: "Not started",
Location: "Tianhe Stadium",
HomeTeamYellowCardDetails: { },
AwayTeamYellowCardDetails: { },
HomeTeamRedCardDetails: { },
AwayTeamRedCardDetails: { }
},
{
Id: "346527",
Date: "2015-07-15T11:45:00+00:00",
League: "Chinese Super League",
Round: "19",
HomeTeam: "Shanghai Greenland Shenhua",
HomeTeam_Id: "1107",
HomeGoals: "0",
AwayTeam: "Beijing Guoan",
AwayTeam_Id: "1098",
AwayGoals: "0",
Time: "Not started",
Location: "Hongkou Football Stadium",
HomeTeamYellowCardDetails: { },
AwayTeamYellowCardDetails: { },
HomeTeamRedCardDetails: { },
AwayTeamRedCardDetails: { }
},
}

现在我需要为每场比赛添加一些额外的字段,例如,如果 HomeTeam = Real Madrid ,添加额外的字段 HomeTeamShort = RMD 等。这应该动态完成,因为我必须为每支客队和主队创建 IF。

有人可以帮助我如何做到这一点?

【问题讨论】:

  • 你想在哪里添加额外的代码?在json文件中?你能给出 var_dump($result); 的结果吗?在这里?
  • 嗨,var_dump ($result);这是一个 xml(api 只返回 xml)然后我用相同的数据在 json 中编码: 3532682015-07-18T13:30:00+00 :00Ekstraklasa1Ruch Chorzow437Gornik Leczna AwayTeam> 127101 (...)

标签: php arrays json api


【解决方案1】:

首先你必须解码你的json

$array = json_decode($result);

获取匹配数组

$arr = $array->Match;

现在遍历所有对象(即)并做任何必要的事情

foreach($arr as $item) { //foreach element in $arr
    //do whatever you want to do with that object
    if($item->HomeTeam == "Real Madrid") {
       $item->HomeTeamShort = "RMD";
    }
}

print_r($arr); //Now $arr is the required result you wanted to have

//you can also convert your array back json 
$arr2 = json_encode($arr);

如果您需要其他内容,请告诉我,我会更改代码以满足您的需求。

谢谢。

* 示例的其他帮助 *

在运行循环之前检查您是否正确放置了对象的变量和数组。由于我看不到您在代码中真正做了什么以及您的行号是什么,因此我将一个完整的虚拟代码与输出一起粘贴,请将其与您自己的代码进行比较,您应该能够获得正确的输出.

<?php
//let's take an example json data
$result = '{"Match":
                [
                    {"name":"Tom", "age":22},
                    {"name":"Jerry", "age":20},
                    {"name":"Hank", "age":25}
                ]           
            }';

$array = json_decode($result);
$arr = $array->Match;

让我们在处理之前打印一次数组

print_r($arr); //Array ( [0] => stdClass Object ( [name] => Tom [age] => 22 ) [1] => stdClass Object ( [name] => Jerry [age] => 20 ) [2] => stdClass Object ( [name] => Hank [age] => 25 ) )

现在做循环的事情,并将你需要的任何属性添加到你想要的任何对象

foreach($arr as $item) { //foreach element in $arr
    //do whatever you want to do with that object
    if($item->name == "Jerry") {
       $item->color = "Brown";
    }
}

现在,如果您再次打印该数组,您将看到 棕色已添加到 Jerry

print_r($arr); //Array ( [0] => stdClass Object ( [name] => Tom [age] => 22 ) [1] => stdClass Object ( [name] => Jerry [age] => 20 [color] => Brown ) [2] => stdClass Object ( [name] => Hank [age] => 25 ) )

如果需要,将数组转换回 json

$arr2 = json_encode($arr);

现在,检查 json,您还会看到 Color Brown 反对 Jerry

var_dump($arr2); //string(92) "[{"name":"Tom","age":22},{"name":"Jerry","age":20,"color":"Brown"},{"name":"Hank","age":25}]"

?>

这是对这段代码的逐步分析和解释。如您所见,我没有收到任何未定义的对象错误。所以,试着复制粘贴我上面的代码,如果你能复制同样的错误,那么我很容易理解是什么导致了你的错误。

我也做了一个PHPFiddle Link here,你也可以在那里检查代码并运行它。

再次感谢。

【讨论】:

  • 嗨,Suman,非常感谢您的帮助;),当我使用您的代码时出现 2 个错误:尝试在第 22 行获取非对象的属性,并为提供的参数无效第 23 行的 foreach() ,起初我尝试修复,因为您从未将更改的 $item 保存回 $arr 并且我更改了 foreach($arr as &$item) 但仍然显示相同的错误,知道吗?再次感谢您的帮助
  • 嗨@SaulHenriques,欢迎:) 我已经为我的答案添加了详细解释,还添加了输出。我没有收到任何对象未定义错误。查看您是否正确使用了对象数组。或者,如果您使用我的代码复制您的错误,我将很乐意为您提供帮助。但是由于我看不到您的代码,因此您的行号对我没有用。 :P,你总是可以感谢我选择/支持我的答案;) :D 一切顺利 :)
【解决方案2】:

谢谢你的帮助,不要解决我的问题而是让我进步(我越来越接近了)

也许是我的错,因为我没有提供一些重要的东西

所以.. 我在 phpfiddle 上测试了你的代码,它可以工作,并且主要是因为你在代码上直接有 json,在我的项目中我需要从服务器打开 file.json,并且你的代码甚至可以适应一些事情,我得到了一些错误,所以......我稍微改变你的代码:

    <?php

$json_url = "http://getinstagoal.com/2015-07-20.json";
    $json = file_get_contents($json_url);
    $links = json_decode($json, TRUE);

foreach($links["Match"] as $key=>$val) {
        if($val['HomeTeam'] == "Palmeiras") {

            $val['HomeTeamshor'] = "RMD";

    }
}




//you can also convert your array back json 
$arr2 = json_encode($links);

//print the json, you will also see the Color Brown there against Jerry
var_dump($arr2); //string(92) "[{"name":"Tom","age":22},{"name":"Jerry","age":20,"color":"Brown"},{"name":"Hank","age":25}]"


?>

使用该代码我能够获得正确的数据,我尝试使用一些回声等。

但是,即使在服务器上以 root 身份运行 php,文件更新也不起作用,我检查并且“if”有效(我用“echo”测试它)我尝试使用 file_put_content 不起作用,这是我唯一的方法成功地在 json 文件中添加了一些内容,并创建了内容数组,但这将重写整个文件。有什么想法吗?

其他事情,我需要做“如果”每场比赛有 8 个项目,比如

if($val['HomeTeam'] == "Real Madrid") {

            $val['HomeTeamshort'] = "RMD";
 }

if($val['AwayTeam'] == "Barcelona") {

            $val['AwayTeamshort'] = "FCB";
 }

1300多(应该在文件里比较一下,一般是一天20场,没那么多)

我必须对每场比赛执行此“ifs”的最有效方法是什么?

谢谢@Suman

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2011-11-09
    • 2013-06-18
    • 2013-06-24
    相关资源
    最近更新 更多