所以当我努力理解PHP的主要数据结构来源时,我一直在问很多基于数组的问题。
我目前正致力于建立一个能够列出艺术家及其歌曲列表的课程。每首第三首歌都有一个日期。如在这个数组中所见:
$music = array(
'Creed' => array(
'Human Clay' => array(
array(
'title' => 'Are You Ready'
),
array(
'title' => 'What If'
),
array(
'title' => 'Beautiful',
'date' => '2012'
),
array(
'title' => 'Say I'
),
array(
'title' => 'Wrong Way'
),
array(
'title' => 'Faceless Man',
'date' => '2013'
),
array(
'title' => 'Never Die'
),
array(
'title' => 'With Arms Wide pen'
),
array(
'title' => 'Higher',
'date' => '1988'
),
array(
'title' => 'Was Away Those Years'
),
array(
'title' => 'Inside Us All'
),
array(
'title' => 'Track 12',
'date' => '1965'
),
),
),
);
我写的内容如下:
class Music{
protected $_music = array();
protected $_html = '';
public function __construct(array $music){
$this->_music = $music;
}
public function get_music(){
$year = '';
$this->_html .= '<d1>';
foreach($this->_music as $artist=>$album){
$this->_html .= '<dt>' . $artist . '</dt>';
foreach($album as $track=>$song){
foreach($song as $songTitle){
if(isset($songTitle['date']) && !empty($songTitle['date'])){
$year = '['.$songTitle['date'].']';
}
$this->_html .= '<dd>' . $songTitle['title'] . $year. '</dd>';
}
}
}
$this->_html .= '</d1>';
}
public function __toString(){
return $this->_html;
}
}
$object = new Music($music);
$object->get_music();
echo $object;
我的问题是,我最终得到的东西看起来像这样:
Creed
Are You Ready
What If
Beautiful[2012]
Say I[2012]
Wrong Way[2012]
Faceless Man[2013]
Never Die[2013]
With Arms Wide pen[2013]
Higher[1988]
Was Away Those Years[1988]
Inside Us All[1988]
Track 12[1965]
正如你所看到的,几乎每一首歌都在它旁边有一个日期,而在数组中并非如此。我的问题是这笔交易是什么?我想在我的循环中我非常清楚地说明这首歌是否有一年,设置它然后将它打印在歌曲标题旁边?
有人可以指出我正确的方向吗?
答案 0 :(得分:0)
您在设置之后永远不会重置$year
,所以一旦您在阵列中遇到第一年的值,您将会在同一年继续使用,直到出现新的值:
if(isset($songTitle['date']) && !empty($songTitle['date'])){
$year = '['.$songTitle['date'].']';
} else {
$year = ''; /// reset year to blank
}
在一些不相关的内容中,这可能是一个错字:
$this->_html .= '<d1>';
^--- number one? not letter L for a `<dl>` tag?
答案 1 :(得分:0)
您没有在foreach循环中重置年份,因此在重新分配值之前,它使用的是最后一年。这是更正的音乐课。
class Music{
protected $_music = array();
protected $_html = '';
public function __construct(array $music){
$this->_music = $music;
}
public function get_music(){
$year = '';
$this->_html .= '<d1>';
foreach($this->_music as $artist=>$album){
$this->_html .= '<dt>' . $artist . '</dt>';
foreach($album as $track=>$song){
foreach($song as $songTitle){
if(isset($songTitle['date']) && !empty($songTitle['date'])){
$year = '['.$songTitle['date'].']';
}
$this->_html .= '<dd>' . $songTitle['title'] . $year. '</dd>';
$year = "";
}
}
}
$this->_html .= '</d1>';
}
public function __toString(){
return $this->_html;
}
}
答案 2 :(得分:0)
如果没有为歌曲设置日期,year
变量将保留上一首歌曲的值(已为其设置)。无论日期是否已设定,您实际上仍在告诉它打印标题旁边的year
。
您需要else
上的if
条款:
if(isset($songTitle['date']) && !empty($songTitle['date'])){
$year = '['.$songTitle['date'].']';
} else {
$year = '';
}
如果未设置日期,这将清除year
。