Autor Zpráva
janky
Profil
Dobrý den, nevím si rady při vypsání dat z výcerozměrného pole.

Tento kód mi vypíše všechny prvky v poli. Já bych ale potřeboval jen konkrétní prvek v poli.

$data = file_get_contents('https://api.scryfall.com/cards/named?fuzzy=fireball');
$items = json_decode($data,true);

foreach ($items['image_uris'] as $item) {
  echo $item.'<br>';
}

Chtěl bych získat řádek podle klíče ["small"] v poli.
Radek9
Profil
janky:
Prostě k němu takhle přistoupíš:

echo $items['image_uris']['png'] // Místo png může být libovolný jiný klíč
janky
Profil
Radek9:
Takový kód mi vypisuje warning.

$data = file_get_contents('https://api.scryfall.com/cards/named?fuzzy=fireball');
$items = json_decode($data,true);

echo "<pre>";
var_dump($items);
echo "</pre>";


foreach ($items['image_uris'] as $item) {
  echo $item['image_uris']['small'].'<br>';
}
blaaablaaa
Profil
Ten foreach dej pryč a nech tam:
echo $items['image_uris']['small'].'<br>';
Tomášeek
Profil
blaaablaaa:
Není tu zdrojové pole, ale spíše

echo $item['small'].'<br>';

Foreach asi bude chtěný a správný.
janky
Profil
Ale co když mi ten json vrátí několik desítek polí a já budu chtít z každého získat obrázek. Toho bych potřeboval docílit.
Radek9
Profil
janky:
JSON na uvedené adrese je evidentně jeden jedinný objekt. Ten má atribut image_uris, ve kterém je evidentně také jeden jedinný objekt. Jeho atributy potom obsahují jednotlivé adresy obrázků. Pokud chceš vypsat všechny, použij cyklus z [#1]. Pokud chceš vypsat jeden konkrétní (png nebo small apod.), použij kód z [#2] (bez toho cyklu).
Jestli tohle nestačí, tak lépe popiš problém. Načítáš i data v jiném formátu z jiných adres?
janky
Profil
Radek9:
Ano tam byl pouze jediný, to byl asi špatný příklad.

Načítám pouze ve formátu JSON z této adresy: api.scryfall.com... Podle filtru který si navolím. Výsledná URL z které načítám data pak může vypadat https://api.scryfall.com/cards/search?q=frame%3Amooneldrazidfc: Například toto mi načte 14 objektů (každý má vlastní image_uris a spostu dalších informací).

Já bych ty informace chtěl vypsat přes foreach, konkrétně třeba obrázky ["image_uris"]["small]. Tak aby získal 14 URL adres obrázků.

Jenže co když mi ten dotaz vrátí jen jeden objekt - pak bych to musel řešit podmínkou?
Radek9
Profil
janky:
V případě, že to vrátí víc výsledků, jsou uloženy jako pole v atributu data a dají se iterovat. Následně každý tento item obsahuje pole card_faces, jehož itemy teprve mají položku image_uris. Takže nějak takhle:

$data = file_get_contents('https://api.scryfall.com/cards/search?q=frame%3Amooneldrazidfc');
$json = json_decode($data, true);
 
foreach ($json['data'] as $item) {
  echo 'Name: ' . $item['name'] . '<br>';
  foreach ($item['card_faces'] as $cardFace) {
    echo $cardFace['image_uris']['small'] . '<br>';
  }
}
DarkMeni
Profil
janky:
Jenže co když mi ten dotaz vrátí jen jeden objekt - pak bych to musel řešit podmínkou?

Já bych to řešil tak, že bych ten jednodušší výsledek (jen 1 kartu) přizpůsobil na ten složitější tvar objektu (více karet, několik card_faces), a pak vždy pracoval jakoby s tím složitějším objektem.

<?php 
    $data = file_get_contents('https://api.scryfall.com/cards/search?q=frame%3Amooneldrazidfc');
    $items = json_decode($data,true);
    
    
    // Adaptace objektu...
    
    // $items -> array of cards
    $items = isset($items["data"]) ? $items["data"] : array($items);
    // $items -> array of cards -> card_faces
    if(!isset($items[0]["card_faces"])) $items[0]["card_faces"] = array(array("image_uris" => $items[0]["image_uris"]));     
    
    
    // Prochazeni vicerozmerneho pole...
    foreach($items as $card)
    { 
        $card_name = isset($card["name"]) ? $card["name"] : "Uknown card";
        echo "<b>Card name:</b> $card_name<br><br>";
        
        foreach($card["card_faces"] as $i => $face)
        { 
            if(isset($face["name"]))
            {
                $face_id = $i + 1;
                $face_name = isset($face["name"]) ? $face["name"] : "Uknown name";
                echo "<b>Card face #$face_id:</b> $face_name<br>";
            }
            
            foreach($face["image_uris"] as $type => $uri)
            {
                echo "$type: $uri<br>";
            }
            echo "<br>";    
        }
        echo "<br><hr><br>";
    }
     
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0