使用PHP和多个foreach语句从JSON文件中读取

时间:2017-01-25 13:07:08

标签: php json

我尝试使用PHP从JSON文件中读取。但我现在被困住了。

这是我的JSON文件:

Array
(
    [date] => 25-1-2017
    [leagues] => Array
        (
            [0] => Array
                (
                    [league_id] => 0
                    [league_name] => كأس امم افريقيا
                    [league_logo] => http://3.bp.blogspot.com/-4iampWUCLto/VmldL2XTz7I/AAAAAAAAD0I/eZFfzSxRbnE/s60/africa.png
                    [league_matches] => Array
                        (
                            [0] => Array
                                (
                                    [match_id] => 1
                                    [team1logo] => http://2.bp.blogspot.com/-mycTzHXuzJA/Ugbb-UG_3JI/AAAAAAAAEv0/_mzaSHnRedE/s60/egypt+(4).png
                                    [team2logo] => http://1.bp.blogspot.com/-kYrkU4jahZY/UgbeVpHf8RI/AAAAAAAAFIQ/TBgM5fvVW14/s60/ghana+(3).png
                                    [match_time] => 19:00
                                    [channels_id] => Array
                                        (
                                            [0] => 18
                                        )

                                    [team1] => مصر 
                                    [team2] => غانا
                                )

                            [1] => Array
                                (
                                    [match_id] => 2
                                    [team1logo] => http://3.bp.blogspot.com/-_y1MazEn-vg/UgbeoIWUpII/AAAAAAAAFPI/JTRGGpG3GiQ/s60/mali+(4).png
                                    [team2logo] => http://2.bp.blogspot.com/-GTxKONxvKy4/Ugt6AKXOmyI/AAAAAAAAF8Y/pPcM0O58cQI/s60/uganda_2.png
                                    [match_time] => 19:00
                                    [channels_id] => Array
                                        (
                                            [0] => 19
                                        )

                                    [team1] => مالي
                                    [team2] => أوغندا
                                )

                        )

                )

            [1] => Array
                (
                    [league_id] => 1
                    [league_name] => كأس ملك أسبانيا
                    [league_logo] => http://1.bp.blogspot.com/-zAzWT2Vpbe0/Vmle9TUWDlI/AAAAAAAAD04/-BKgPzRCT1k/s60/Copa_del_Rey_logo_since_2012.png
                    [league_matches] => Array
                        (
                            [0] => Array
                                (
                                    [match_id] => 3
                                    [team1logo] => http://4.bp.blogspot.com/-6sfdkbboNdk/VBxVKisRkcI/AAAAAAAADG8/oBKDHmBW5xc/s60/eibar+fc.png
                                    [team2logo] => http://2.bp.blogspot.com/-S7p2yMaLywM/UhCz6GqNCRI/AAAAAAAAGFE/CfxzSQk8bgQ/s60/Atletco+Madrid2.Png
                                    [match_time] => 18:15
                                    [channels_id] => Array
                                        (
                                            [0] => 1
                                        )

                                    [team1] => إيبار
                                    [team2] => أتلتيكو مدريد
                                )

                            [1] => Array
                                (
                                    [match_id] => 4
                                    [team1logo] => http://1.bp.blogspot.com/--6y77FXuPLI/UjeVcpJ-AJI/AAAAAAAAGok/QyZhwahPamo/s60/Celta+Vigo.png
                                    [team2logo] => http://2.bp.blogspot.com/-tncIAL_U6mI/UgbnQw75V8I/AAAAAAAAFhA/8-9Xpw83GKY/s60/Real+Madrid+(3).png
                                    [match_time] => 20:15
                                    [channels_id] => Array
                                        (
                                            [0] => 3
                                        )

                                    [team1] => سيلتا فيغو 
                                    [team2] => ريال مدريد
                                )

                        )

                )

            [2] => Array
                (
                    [league_id] => 2
                    [league_name] => كأس الرابطة الإنجليزية
                    [league_logo] => http://4.bp.blogspot.com/-31G65FeskFs/VmlezHMPm_I/AAAAAAAAD0w/9OMjh8AQP-M/s60/TheFA_CapitalOneCup.png
                    [league_matches] => Array
                        (
                            [0] => Array
                                (
                                    [match_id] => 5
                                    [team1logo] => http://3.bp.blogspot.com/-D0lb4b-qN5U/UgbeDosqjYI/AAAAAAAAFBY/Qg7kvoodvFY/s60/Liverpool+(2).png
                                    [team2logo] => http://2.bp.blogspot.com/-prH3jgmfewQ/Ug8ZgNxPlcI/AAAAAAAAGAU/HLmbFvGuDB8/s60/Southampton.png
                                    [match_time] => 20:00
                                    [channels_id] => Array
                                        (
                                            [0] => 2
                                        )

                                    [team1] => ليفربول
                                    [team2] => ساوثهامبتون
                                )

                        )

                )

            [3] => Array
                (
                    [league_id] => 3
                    [league_name] => كاس ايطاليا
                    [league_logo] => http://2.bp.blogspot.com/-p9Kjb2_GZPU/VnAdQcHV9_I/AAAAAAAAD7E/6R-P54Upui4/s60/tim-cup.png
                    [league_matches] => Array
                        (
                            [0] => Array
                                (
                                    [match_id] => 6
                                    [team1logo] => http://1.bp.blogspot.com/-POxAfSSnlW0/UhCt7oQsdLI/AAAAAAAAGDo/rMRXx2mqvUI/s60/Juventus[1].Png
                                    [team2logo] => http://3.bp.blogspot.com/-_Qj_GaxVaDE/UgaEPtt7EsI/AAAAAAAAEA8/redsOTj7F4Q/s60/Ac+Milan+(3).png
                                    [match_time] => 20:00
                                    [channels_id] => Array
                                        (
                                            [0] => 103
                                        )

                                    [team1] => يوفنتوس
                                    [team2] => ميلان
                                )

                        )

                )

        )
)

到目前为止,这是我的PHP:

$str = file_get_contents($url);
$json = json_decode($str, true); 
$date = $json['date'];
$leagues = $json['leagues'][0];
foreach ($leagues as $key => $value) {
    for ($i=0; $i<count($value); $i++) {
        foreach ($value[$i] as $key1 => $value1) {
            $sql = "INSERT INTO table_name (column1,column2,column3,column4) VALUES (...,...,...,...)";
             for ($c=0; $c<count($value1); $c++) {
                foreach ($value1[$c] as $key2 => $value2) {
                    echo $value2;
                } 
            } 
        } 
    } 
 } 

问题如何通过foreach读取所有每个数组并将每个值存储到数据库中的表。

我很感激这个例子。

2 个答案:

答案 0 :(得分:0)

循环json中所有节点的基本结构

//leagues level
foreach ($json['leagues'] as $key => $league) {
   $league_id = $league['league_id'];
   //leagues -> league_matches level
   foreach ($league['league_matches'] as $key => $match) {
       $match_id = $match['match_id'];
       //channel ids
       foreach ($match['channels_id'] as  $channels_id) {
          //$channels_id;
         //create an sql
         $sql = "INSERT INTO xy (col1,col2,col3) values ($league_id,$match_id,$channels_id)";
        $db->query($sql);
       }
   }
}

关于SQL您没有显示数据库的任何结构,所以我无法帮助创建SQL。

答案 1 :(得分:0)

我希望您的JSON文件使用json_encode()方法发送值。您需要使用逗号(,)分隔数组元素。您还需要在引号(&#39;)中编写数组索引。以下是JSON页面的更正样本。

$retArr = Array
(
['date'] => 25-1-2017,
['leagues'] => Array
    (
        [0] => Array
            (
                ['league_id'] => 0,
                ['league_name'] => كأس امم افريقيا,
                ['league_logo'] => http://3.bp.blogspot.com/-4iampWUCLto/VmldL2XTz7I/AAAAAAAAD0I/eZFfzSxRbnE/s60/africa.png,
                ['league_matches'] => Array
                    (
                        [0] => Array
                            (
                                ['match_id'] => 1,
                                ['team1logo'] => http://2.bp.blogspot.com/-mycTzHXuzJA/Ugbb-UG_3JI/AAAAAAAAEv0/_mzaSHnRedE/s60/egypt+(4).png,
                                ['team2logo'] => http://1.bp.blogspot.com/-kYrkU4jahZY/UgbeVpHf8RI/AAAAAAAAFIQ/TBgM5fvVW14/s60/ghana+(3).png,
                                ['match_time'] => 19:00
                                ['channels_id'] => Array
                                    (
                                        [0] => 18
                                    )

                                ['team1'] => مصر ,
                                ['team2'] => غانا
                            )

                    )

            )
    )
);
echo json_encode($retArr);

在接收页面上,您需要在json_decode()方法中将第二个参数设置为 TRUE ,这样您才能将结果作为数组而不是JSON对象获取。< / p>

$str = file_get_contents($url);
$json = json_decode($str, true); 
$date = $json['date'];
$leagues = $json['leagues'][0];
foreach ($leagues as $key => $value) {
    for ($i=0; $i<count($value); $i++) {
        foreach ($value[$i] as $key1 => $value1) {
            $sql = "INSERT INTO table_name (column1,column2,column3,column4) VALUES (...,...,...,...)";
             for ($c=0; $c<count($value1); $c++) {
                foreach ($value1[$c] as $key2 => $value2) {
                    echo $value2;
                } 
            } 
        } 
    } 
 } 

试试这种方式。