Какой тип данных PHP я использую?


Я 4 дня смотрел на Google, stack и другие сайты, пытаясь разобраться в этом, поэтому я ценю любую помощь, которую вы можете предложить... Я n00b, поэтому приношу извинения, если я злоупотребляю какими-либо терминами.

То, что я пытаюсь сделать:

Я пытаюсь создать веб-сайт группы просто для практики. Я хочу создать блок кода, в котором хранится несколько фрагментов информации о песне, а затем использовать эти данные в музыкальном проигрывателе. Каждая песня будет иметь свой собственный проигрыватель, который покажет название песни, художественное произведение для песни и позволяет воспроизводить саму песню.

Чтобы сократить время загрузки сайта и избежать повторяющегося кода, я хотел бы использовать цикл, чтобы у меня был один фрагмент кода для плеера(ов), а затем создать отдельную итерацию проигрывателя для каждой песни.

Я думаю, что смогу справиться с аспектом цикла, но я не могу понять, какой тип данных использовать для хранения нескольких фрагментов информации о песне. Будет ли это массив, функция, что-то еще?

Я не ищу кого-то, кто бы закодировал это для меня, я просто хочу знать, в каком направлении двигаться.

Вот приблизительный набросок того, что я имею в виду, очевидно, без надлежащего синтаксиса:

$song(crashing) {  
  $songTitle = "Crashing";  
  $songPath = "crashingSong.php";  
  $songArtwork = "crashingArt.php";  
}

$song(Juliana) {  
  $songTitle = "Juliana";  
  $songPath = "julianaSong.php";  
  $songArtwork = "julianaArtwork.php";  
}

$player {
  echo "<div class=\"titleHead\">" . $songTitle . "</div>";
  echo "<div class=\"link\">" . $songPath . "</div>";
  echo "<div class=\"artwork\">" . $songArtwork . "</div>";
}

Тогда у меня был бы цикл, который повторял бы проигрыватель для каждой песни.

Помочь?

Author: smadams, 2014-12-29

8 answers

Вы можете хранить эту информацию несколькими способами. Первый из них представляет собой многомерный массив, каждая песня может содержать элемент в массиве, а затем содержать поддиапазон с данными песни.

<?php

    //Store songs as multidemensional array
    $songs = array(
        'crashing' => array(
            'songTitle' => 'Crashing',
            'songPath' => 'crashingSong.php',
            'songArtwork' => "crashingArt.php"
        ),
        'Juliana' =>  array(
            'songTitle' => 'Juliana',
            'songPath' => 'julianaSong.php',
            'songArtwork' => "julianaArtwork.php"
        )
    );

    //Now iterate through each song
    foreach($songs as $title => $data) {

        echo "<div class=\"titleHead\">" . $data['songTitle'] . "</div>";
        echo "<div class=\"link\">" .  $data['songPath'] . "</div>";
        echo "<div class=\"artwork\">" . $data['songArtwork'] . "</div>";

    }   

?>

Второй способ - создать класс с песнями и добавить некоторые методы, помогающие сохранять и извлекать эти песни.

<?php

class Songs {

    private $songs = array();

    // method declaration
    public function addSong($songTitle, $songPath, $songArtwork) {

        $this->songs[] = array(
            'songTitle' => $songTitle,
            'songPath' => $songPath,
            'songArtwork' => $songArtwork
        );

    }

    public function getSongs() {
        return $this->songs;
    }

}


//Initilaize songs class
$songRef = new Songs();

//Add SOngs
$songRef->addSong('Crashing', 'crashingSong.php', 'crashingArt.php');
$songRef->addSong('Juliana', 'julianaSong.php', 'julianaArtwork.php');

$songs = $songRef->getSongs();

//Now iterate through each song
foreach($songs as $key => $data) {

    echo "<div class=\"titleHead\">" . $data['songTitle'] . "</div>";
    echo "<div class=\"link\">" .  $data['songPath'] . "</div>";
    echo "<div class=\"artwork\">" . $data['songArtwork'] . "</div>";

}

?>
 4
Author: John Miller, 2014-12-29 17:02:40

Ассоциативный массив массивов выполнит эту работу.

Что-то вроде:

$songs = array(
   'crashing' => array('Title' => "Crashing",  
                       'Path' => "crashingSong.php",  
                       'Artwork' => "crashingArt.php"
                  ), //<repeat for more songs>
    ); 

Затем вы можете выполнить цикл $songs. И вы получили бы доступ к названию, как $songs['crashing']['Title'].

Тем не менее, это идеальное время для использования объектно-ориентированного программирования. У вас может быть класс песни с такими атрибутами, как название, путь и т. Д., И метод с именем renderPlayer(). Это немного сложно для обработки в ответе SE, но вы можете поискать в Google тонны информации об ООП PHP.

На самом деле Джо ответ - отличное начало для определения класса песен.

 2
Author: dan08, 2014-12-29 16:48:11

Вероятно, вам лучше всего определить класс для хранения вашей информации. См.: http://php.net/manual/en/language.oop5.php

Вы можете сохранить его в массиве и просто всегда иметь индекс 0 в качестве названия песни и т.д.

Вы также можете сохранить его в ассоциативном массиве, где индексы являются строками, а не целыми числами. Тогда это может быть $song['songTitle']

Коллекция полос может храниться таким же образом, только вложенной.

 0
Author: LavaSlider, 2014-12-29 16:44:07

Если вариант использования так же прост, как описано, вы можете просто использовать массив:

$songInfo = array( 
      'Crashing' => array('Title' => 'Crashing', 'Path' => "crashingSong.php", 'Artwork' => 'crashingArt.php')  
);

И затем вы можете получить доступ к этим полям, например:

$songInfo['Crashing']['Path'] 

Если вы намерены сделать что-то более сложное, вам, вероятно, следует создать класс.

 0
Author: apokryfos, 2014-12-29 16:44:10

Вы можете использовать массив для сохранения ваших данных (или файл .xml, .json). Для взаимодействия вы можете попробовать (простой пример, извините):

$music = array(
    'songTitle'   => "Crashing",   
    'songPath'    => "crashingSong.php", 
    'songArtwork' => "crashingArt.php"
);

foreach( $music as $key => $value ){
    echo $key . $value;
}
 0
Author: Felipe, 2014-12-29 16:53:53

Сначала вам действительно понадобится только ассоциативный массив: одна переменная, группирующая некоторые данные вместе, с легко запоминающимися/читаемыми/понятными именами:

$song = array(
    'artist' => 'Foo',
    'Title'  => 'Bar',
    'Album'  => 'Foobar',
);//and so on

Однако довольно скоро вы обнаружите, что программирование по массиву - не лучший способ создания поддерживаемого кода. Ни в коем случае. Итак, что вы, вероятно, захотите сделать, это создать класс:

class Song
{
    protected $artist = null;
    protected $title = null;
    protected $album = null;
    public function setArtist($artist)
    {
        $this->artist = $artist;
        return $this;
    }
    public function getArtist()
    {
        return $this->artist;
    }
    //add getters and setters for other properties here
}

Чтобы избежать необходимости писать:

$song = new Song();
$song->setArtist('foo')
    ->setTitle('bar');//and so on

Все время вам захочется добавлять конструктор:

public function __construct(array $data)
{
    foreach ($data as $key => $value)
    {
        $this->{'set'.ucfirst($key)}($value);//<-- of course, check if method exists first
    }
}

В качестве добавленные кости, вы можете создавать классы, представляющие альбом (содержащий массив песен), или класс Artist, который, в свою очередь, содержит массив песен и массив альбомов. Таким образом, ваши объекты могут быть легко сгруппированы вместе.

Как только вы это сделаете, вам будет просто связать эти классы моделей со схемой реляционной базы данных (где запись альбома ссылается на запись исполнителя (внешние ключи)), и каждая песня ссылается на альбом, поэтому все данные хорошо связаны вместе.

 0
Author: Elias Van Ootegem, 2014-12-29 16:58:24

Я сделал это примерно за 10 минут, так что это не совсем точно, но я надеюсь, что вы знаете, как читать UML (я, очевидно, не делал это в чистом UML, но это начальная база):)

UML for Song and SongManager Classes

PS: $_DMB - это переменная, в которой вы должны хранить свой менеджер баз данных (pdo или оболочку)

 0
Author: Bobot, 2014-12-29 16:59:12

Вы можете хранить всю эту информацию в так называемом классе.

<?php 

class Song {
  private $Title;
  private $path;
  private $Artwork;
}

function Display(){
  echo "<div class=\"titleHead\">" . $this->DisplayTitle(). "</div>
        <div class=\"link\">" . $this->DisplayPath(). "</div>
        <div class=\"artwork\">" .$this->DisplayArtWork() . "</div>
       ";

function DisplayTitle() {
  echo $this->Title;
}

function DisplayPath(){
  echo $this->Path
}

function DisplayArtWork(){
  echo $this->Artwork
}

?>

Класс является "пригодным для повторного использования".

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

 0
Author: Joe Swindell, 2014-12-29 17:02:59