0

I have a foreach loop that is supposed to loop through JSON and return the appropriate ID of each video listed in JSON using the Youtube api. Here is my code:

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 is, the array push is working correctly, but it is only adding the 1st ID in the list only for each loop iteration when i echo it. When I echo the $id variable, it prints all IDs just fine.

Ultimately i want to be able to create an object for each video, storing it's ID and other information.

I feel like this is a simple fix but i can't figure it out for the life of me. I would appreciate any help! Also if i am going about this all wrong, advice is appreciated as well!

Thanks!

1
  • echo $vidArray[0]; only echos the first element. Try print_r($vidArray); Commented May 12, 2016 at 19:40

2 Answers 2

1

I've played little bit with your code. I've modified your class. I've renamed plurar Videos to Video (singular).

Then I've added an attribute $id, because name of properties should be simple and represent the data we want to store in them.

Then I've added getter and setter for the $id property.

I don't know the $url, so I've just write simple JSON string instead. I tried to mimic the structure that you're using in your code.

Then I've added () to the end of new Video() to have proper constructor called.

And instead of pushing elements into array, I'm using proper $array[$index] = assignment.

Last thing, I've moved writing out the data out of the foreach-cycle. And I'm using var_export to get proper php code to play with if redirected to another file.

<?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);
Sign up to request clarification or add additional context in comments.

Comments

1

In your code your class Videos contains two functions

setVideoTitle(...),
getVideoTitle()

but in your foreach you have called $videos->getVideoUrl() , $videos->setVideoUrl(...)

what is this ???

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.