首页 > 解决方案 > 多维数组中的非法字符串偏移

问题描述

我正在尝试从单独的网站获取 JSON 文件,读取该文件,然后将其解码为多维数组。到目前为止,它似乎有效。但是,当我尝试将其全部分解为变量以进行回显时,当其 4 级深度时它会出错。您可以从 PHP 代码中的链接看到实际的 JSON 文件,下面是我正在使用的 PHP 代码。有问题的具体变量是 2 个区域的 $prices 和 $rules。有人可以提供的任何帮助将不胜感激。

<?php

$path           = 'https://www.mtgjson.com/json/LEA.json';
$FileContents   = file_get_contents($path);
$cards          = json_decode($FileContents, true);

foreach ($cards['cards'] as $mtgcard){
$Artist                     = $mtgcard['artist'];
$borderColor                = $mtgcard['borderColor'];
$colorIdentity              = $mtgcard['colorIdentity'][0];
$Colors                     = $mtgcard['colors'][0];
$convertedManaCost          = $mtgcard['convertedManaCost'];
$edhrecRank                 = $mtgcard['edhrecRank'];
$flavorText                 = $mtgcard['flavorText'];
$cards_foreignData          = implode($mtgcard['foreignData'],",");
$foreignData                = explode(',', $cards_foreignData);
$frameVersion               = $mtgcard['frameVersion'];
$hasFoil                    = $mtgcard['hasFoil'];
$hasNonFoil                 = $mtgcard['hasNonFoil'];
$isPaper                    = $mtgcard['isPaper'];
$Layout                     = $mtgcard['layout'];
$cards_legalities           = implode($mtgcard['legalities'],",");
$legalities                 = explode(',', $cards_legalities);
$manaCost                   = $mtgcard['manaCost'];
$mcmId                      = $mtgcard['mcmId'];
$mcmMetaId                  = $mtgcard['mcmMetaId'];
$mtgstocksId                = $mtgcard['mtgstocksId'];
$multiverseId               = $mtgcard['multiverseId'];
$name                       = $mtgcard['name'];
$number                     = $mtgcard['number'];
$originalText               = $mtgcard['originalText'];
$originalType               = $mtgcard['originalType'];
$power                      = $mtgcard['power'];
$cards_prices               = implode($mtgcard['prices'],",");
$prices                     = explode(',', $cards_prices);
$cards_prices_2             = implode($cards_prices['paper'],",");
$prices_2                   = explode(',', $cards_prices_2);
$cards_printings            = implode($mtgcard['printings'],",");
$printings                  = explode(',', $cards_printings);
$cards_purchaseUrls         = implode($mtgcard['purchaseUrls'],",");
$purchaseUrls               = explode(',', $cards_purchaseUrls);
$rarity                     = $mtgcard['rarity'];
$cards_rulings              = implode($mtgcard['rulings'],",");
$rulings                    = explode(',', $cards_rulings);
$scryfallId                 = $mtgcard['scryfallId'];
$scryfallIllustrationId     = $mtgcard['scryfallIllustrationId'];
$scryfallOracleId           = $mtgcard['scryfallOracleId'];
$cards_subtypes             = implode($mtgcard['subtypes'],",");
$subtypes                   = explode(',', $cards_subtypes);
$cards_supertypes           = implode($mtgcard['supertypes'],",");
$supertypes                 = explode(',', $cards_supertypes);
$tcgplayerProductId         = $mtgcard['tcgplayerProductId'];
$text                       = $mtgcard['text'];
$toughness                  = $mtgcard['toughness'];
$type                       = $mtgcard['type'];
$types                      = $mtgcard['types'][0];
$uuid                       = $mtgcard['uuid'];

$a       = substr($scryfallId, 0, 1);
$b       = substr($scryfallId, 1, 1);
$convert = "<img src='https://img.scryfall.com/cards/large/front/" .$a. "/" .$b. "/" .$scryfallId. ".jpg' />";

echo $convert;
echo    "Artist Name:  "        .$Artist.               "<br/>";
echo    "Border Color:  "       .$borderColor.          "<br/>";
echo    "colorIdentity:  "      .$colorIdentity.        "<br/>";
echo    "Colors:  "             .$Colors.               "<br/>";
echo    "convertedManaCost:  "  .$convertedManaCost.    "<br/>";
echo    "edhrecRank:  "         .$edhrecRank.           "<br/>";
echo    "flavorText:  "         .$flavorText.           "<br/>";
echo    "foreignData:  "        .$foreignData[0].       "<br/>";
echo    "frameVersion:  "       .$frameVersion.         "<br/>";
echo    "hasFoil:  "            .$hasFoil.              "<br/>";
echo    "hasNonFoil:  "         .$hasNonFoil.           "<br/>";
echo    "isPaper:  "            .$isPaper.              "<br/>";
echo    "Layout:  "             .$Layout.               "<br/>";
echo    "Brawl:  "              .$legalities[0].        "<br/>";
echo    "Commander:  "          .$legalities[1].        "<br/>";
echo    "Duel:  "               .$legalities[2].        "<br/>";
echo    "Future:  "             .$legalities[3].        "<br/>";
echo    "Historic:  "           .$legalities[4].        "<br/>";
echo    "Legacy:  "             .$legalities[5].        "<br/>";
echo    "Modern:  "             .$legalities[6].        "<br/>";
echo    "Oldschool:  "          .$legalities[7].        "<br/>";
echo    "Penny:  "              .$legalities[8].        "<br/>";
echo    "Pioneer:  "            .$legalities[9].        "<br/>";
echo    "Standard:  "           .$legalities[10].       "<br/>";
echo    "Vintage:  "            .$legalities[11].       "<br/>";
echo    "Manacost:  "           .$manaCost.             "<br/>";
echo    "mcmId:  "              .$mcmId.                "<br/>";
echo    "mcmMetaId:  "          .$mcmMetaId.            "<br/>";
echo    "mtgstocksId:  "        .$mtgstocksId.          "<br/>";
echo    "multiverseId:  "       .$multiverseId.         "<br/>";
echo    "name:  "               .$name.                 "<br/>";
echo    "number:  "             .$number.               "<br/>";
echo    "originaltext:  "       .$originalText.         "<br/>";
echo    "originaltype:  "       .$originalType.         "<br/>";
echo    "power:  "              .$power.                "<br/>";
echo    "MTGO prices:  "        .$prices[0].            "<br/>";
echo    "MTGO Foil Prices:  "   .$prices[1].            "<br/>";
echo    "Paper Prices:  "       .prices[2]              "<br/>"; <- 4 levels deep doesnt work
echo    "Paper Foil Prices:  "  .$prices[3].            "<br/>"; <- 4 levels deep doesnt work
echo    "purchaseUrls:  "       .$purchaseUrls[0].      "<br/>";
echo    "purchaseUrls:  "       .$purchaseUrls[1].      "<br/>";
echo    "purchaseUrls:  "       .$purchaseUrls[2].      "<br/>";
echo    "rarity:  "             .$rarity.               "<br/>";
echo    "ruling:  "             .$rulings['date'].$rulings['text'] "<br/>"; <-- 4 levels deep doesnt work
echo    "scryfallId:  "         .$scryfallId.           "<br/>";
echo    "scryfallIllustrationId:  " .$scryfallIllustrationId. "<br/>";
echo    "scryfallOracleId:  "   .$scryfallOracleId.     "<br/>";
echo    "subtypes:  "           .$subtypes[0].          "<br/>";
echo    "supertypes:  "         .$supertypes[0].        "<br/>";    
echo    "tcgplayerProductId:  " .$tcgplayerProductId.   "<br/>";
echo    "text:  "               .$text.                 "<br/>";
echo    "toughness:  "          .$toughness.            "<br/>";
echo    "type:  "               .$type.                 "<br/>";
echo    "types:  "              .$types.                "<br/>";
echo    "uuid:  "               .$uuid.                 "<br/>";

} ?>

标签: phparraysjsonmultidimensional-array

解决方案


您应该提及数组名称以获取数组内的内容,这是示例代码,艺术家是小写的“a”而不是大写

根据评论请求进行编辑

获取“合法性”数组,使用 implode 分隔,然后使用 爆炸,然后转换为数组以打印这些字符串

注意:只有值将使用 implode 导入,而不是键

<?php
// error_reporting(0);
// header('Content-type: application/json');
$path           = 'https://www.mtgjson.com/json/LEA.json';
$FileContents   = file_get_contents($path);
$cards          = json_decode($FileContents, true);

foreach($cards['cards'] as $mtgcard) {

    echo '<br>' .$course_data1 = $mtgcard['artist']; 

    $cards_legalities = implode($mtgcard['legalities'],",");
    $myArray = explode(',', $cards_legalities);
    echo $myArray[0];// 1st array

    //Multidimensional Array for your updated question
    $cards_prices_paper = implode($mtgcard['prices']['paper'],",");
    $prices_paper_array = explode(',', $cards_prices_paper);
    echo $prices_paper_array[0];

    $rulings_date =  implode(', ', array_column($mtgcard['rulings'], 'date'));
    $rulings_date_array =  explode(",", $rulings_date);
    echo $rulings_date_array[0];
}
?>

推荐阅读