2016-05-12 19 views
0

Ich habe eine foreach-Schleife, die durch JSON durchlaufen und die entsprechende ID jedes in JSON aufgeführten Videos mit dem Youtube API zurückgeben soll. Hier ist mein Code:PHP foreach Array IDs

class Videos { 
    private $mVideoUrl; 

    function setVideoTitle($videoUrl){ 
     $this->mVideoUrl= $videoUrl; 
    } 

    function getVideoTitle(){ 
     return $this->mVideoUrl; 
    } 
} 

$jsonFile = file_get_contents($url); 
$jfo = json_decode($jsonFile); 
$items = $jfo->items; 
$vidArray = array(); 

foreach ($items as $item){ 
    if(!empty($item->id->videoId)){ 
     $Videos = new Videos; 
     $Videos->setVideoUrl($item->id->videoId); 
     $id = $Videos->getVideoUrl(); 
     array_push($vidArray, $id); 
    } 
    echo $vidArray[0]; 
} 

Problem ist, wird das Array Push richtig funktioniert, aber es ist das Hinzufügen nur die erste ID in der Liste nur für jede Schleife Iteration, wenn ich es Echo. Wenn ich die Variable $ id zurückmelde, werden alle IDs korrekt ausgegeben.

Schließlich möchte ich in der Lage sein, ein Objekt für jedes Video zu erstellen, seine ID und andere Informationen zu speichern.

Ich fühle mich wie das ist eine einfache Lösung, aber ich kann es nicht für das Leben von mir herausfinden. Ich würde mich über jede Hilfe freuen! Auch wenn ich das alles falsch mache, wird Rat auch geschätzt!

Danke!

+0

'echo $ vidArray [0];' nur Echos das erste Element. Probieren Sie 'print_r ($ vidArray);' – AbraCadaver

Antwort

1

Ich habe ein wenig mit Ihrem Code gespielt. Ich habe deine Klasse geändert. Ich habe plurar Videos in Video (Singular) umbenannt.

Dann habe ich ein Attribut $ id hinzugefügt, weil Name der Eigenschaften einfach sein sollte und die Daten darstellen, die wir in ihnen speichern möchten.

Dann habe ich Getter und Setter für die $ id-Eigenschaft hinzugefügt.

Ich kenne die $ url nicht, also habe ich einfach eine einfache JSON-Zeichenfolge geschrieben. Ich habe versucht, die Struktur nachzuahmen, die Sie in Ihrem Code verwenden.

Dann habe ich() an das Ende des neuen Video() hinzugefügt, um den richtigen Konstruktor aufgerufen zu haben.

Und anstatt Elemente in Array zu schieben, verwende ich richtige $ array [$ index] = Zuweisung.

Letzte Sache, ich habe bewegt, die Daten aus dem Foreach-Zyklus zu schreiben. Und ich verwende var_export, um richtigen PHP-Code zum Abspielen zu erhalten, wenn er in eine andere Datei umgeleitet wird.

<?php 

class Video 
{ 
    private $mVideoUrl; 
    private $id; // added id attribute 

    /** 
    * @return mixed 
    */ 
    public function getId() // added getter 
    { 
     return $this->id; 
    } 

    /** 
    * @param mixed $id 
    */ 
    public function setId($id) // added setter 
    { 
     $this->id = $id; 
    } 


    function setVideoTitle($videoUrl) 
    { 
     $this->mVideoUrl = $videoUrl; 
    } 

    function getVideoTitle() 
    { 
     return $this->mVideoUrl; 
    } 
} 

// ignored for now 
// $jsonFile = file_get_contents($url); 
$jsonFile = '{"items": [ 
     { "id": { "videoId": 1, "url": "http://www.youtube.com/1" } }, 
     { "id": { "videoId": 2, "url": "http://www.youtube.com/2" } }, 
     { "id": { "videoId": 3, "url": "http://www.youtube.com/3" } }, 
     { "id": { "videoId": 4, "url": "http://www.youtube.com/4" } }, 
     { "id": { "videoId": 5, "url": "http://www.youtube.com/5" } } 
    ] 
}'; 

$jfo = json_decode($jsonFile); 

$items = $jfo->items; 
$vidArray = array(); 

foreach ($items as $item) 
{ 
    if (!empty($item->id->videoId)) 
    { 
     $Video = new Video(); // added brackets 

     $Video->setId($item->id->videoId); // changed to setId 
     $Video->setVideoTitle($item->id->url); 
     $id = $Video->getId(); 
     $vidArray[$id] = $Video; 
    } 

} 

// write out all data 
var_export($vidArray); 
1

In Ihrem Code Ihrer Klasse Videos enthält zwei Funktionen

setVideoTitle(...), 
getVideoTitle() 

aber in Ihrem foreach haben Sie $videos->getVideoUrl() , $videos->setVideoUrl(...)

was genannt ist das ???