У меня есть цикл foreach, который должен проходить через JSON и возвращать соответствующий идентификатор каждого видео, указанного в JSON, с помощью Youtube api. Вот мой код:

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];
}

Проблема в том, что push-массив работает правильно, но он добавляет только 1-й идентификатор в список только для каждой итерации цикла, когда я повторяю его. Когда я повторяю переменную $ id, она прекрасно выводит все идентификаторы.

В конечном итоге я хочу иметь возможность создавать объект для каждого видео, сохраняя его идентификатор и другую информацию.

Я чувствую, что это простое решение, но я не могу понять это хоть убей. Буду признателен за любую помощь! Также, если я ошибаюсь, совет тоже приветствую!

Благодарность!

0
Mr. V 12 Май 2016 в 22:25

2 ответа

Лучший ответ

Я немного поигрался с вашим кодом. Я изменил твой класс. Я переименовал plurar Videos в Video (единственное число).

Затем я добавил атрибут $ id, потому что имя свойств должно быть простым и представлять данные, которые мы хотим в них хранить.

Затем я добавил геттер и сеттер для свойства $ id.

Я не знаю $ url, поэтому вместо этого я просто написал простую строку JSON. Я попытался имитировать структуру, которую вы используете в своем коде.

Затем я добавил () в конец new Video (), чтобы вызвать соответствующий конструктор.

И вместо того, чтобы помещать элементы в массив, я использую правильное назначение $ array [$ index] =.

И последнее: я переместил запись данных из цикла foreach. И я использую var_export, чтобы получить правильный php-код для игры, если он перенаправлен в другой файл.

<?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
Richard 12 Май 2016 в 19:58

В вашем коде ваш класс Videos содержит две функции

setVideoTitle(...),
getVideoTitle()

Но в вашем foreach вы вызвали $videos->getVideoUrl() , $videos->setVideoUrl(...)

Что это ???

1
Undo 24 Май 2016 в 19:03