推入阵列和foreach循环很难

时间:2015-02-27 16:42:52

标签: php arrays wordpress

越来越接近我的问题的解决方案......但现在我再次陷入困境。

我正在尝试返回链接到帖子的所有音频附件。每个帖子都有一个.ogg和一个.mp3文件。每个文件都是Wordpress对象。因此.ogg和.mp3文件的单独对象。所以我回复了他们的“post_parent”#39;值并使用它来链接它们。我使用这个&post; parent'作为我的数组中的一个键。它有效,但不像我想要它。

这是 $ attachments (不完整,我删除了foreach循环中使用的非重要键)。您可以看到每个文件是独立的,所以我必须将它们自己链接到[post_parent],如您所见,有4个文件,但有2个不同的轨道。 ID不同,但[post_parent]是相同的:

[13] => WP_Post Object (
    [ID] => 18619
    [post_title] => IanEwing - Beauty
    [post_parent] => 18612
    [guid] => http://www.moovmnt.com/wp-content/uploads/2015/02/IanEwing-Beauty.ogg
    [post_type] => attachment
    [post_mime_type] => audio/ogg
)
[14] => WP_Post Object (
    [ID] => 18618
    [post_title] => IanEwing - Beauty
    [post_parent] => 18612
    [guid] => http://www.moovmnt.com/wp-content/uploads/2015/02/IanEwing-Beauty.mp3        
    [post_type] => attachment
    [post_mime_type] => audio/mpeg

)
[15] => WP_Post Object (
    [ID] => 18617
    [post_title] => C Y G N - S U P E R N O V A
    [post_parent] => 18612
    [guid] => http://www.moovmnt.com/wp-content/uploads/2015/02/C-Y-G-N-S-U-P-E-R-N-O-V-A.ogg
    [post_type] => attachment
    [post_mime_type] => audio/ogg
)
[16] => WP_Post Object (
    [ID] => 18616
    [post_title] => C Y G N - S U P E R N O V A
    [post_parent] => 18612
    [guid] => http://www.moovmnt.com/wp-content/uploads/2015/02/C-Y-G-N-S-U-P-E-R-N-O-V-A.mp3
    [post_type] => attachment
    [post_mime_type] => audio/mpeg
)

这是我目前得到的,它实际上是正确的......

[18653] => Array (
    [0] => Array (
        [mp3] => 1.mp3
        [ogg] => 1.ogg
    )
)
[18612] => Array (
    [0] => Array (
            [ogg] => 2.ogg
            [mp3] => 2.mp3
    )
    [1] => Array (
            [ogg] => 3.ogg
            [mp3] => 3.mp3
    )
)
[18605] => Array (
    [0] => Array (
            [ogg] => 4.ogg
            [mp3] => 4.mp3
    )
)
[18592] => Array (
    [0] => Array (
            [ogg] => 5.ogg
            [mp3] => 5.mp3
    )
    [1] => Array (
            [ogg] => 6.ogg
            [mp3] => 7.mp3
    )
)

...但我的代码(在底部)无法执行此操作:

[18612] => Array (
    [0] => Array (
            [ogg] => 12.ogg
            [mp3] => 12.mp3
    )
    [1] => Array (
            [ogg] => 13.ogg
            [mp3] => 13.mp3
    )
    [2] => Array (
            [ogg] => 14.ogg
            [mp3] => 14.mp3
    )
    [3] => Array (
            [ogg] => 15.ogg
            [mp3] => 15.mp3
    )
)

这是我使用的代码。我知道,这很奇怪。我正在学习。

我的问题是,正如你所看到的,我使用数字0和1,我只是硬编码。但如果让我们说, 4 <它就不会起作用/ strong>帖子中的文件(如上面的示例)。第二个找到的文件后面的文件将替换 $ playlist_all [$ parent_id] [1] 。因此,不会创建 [2] [3] 。而且我确切地知道为什么顺便说一句,但是我不知道如何检查这些东西是否在数组内部有一个键,如果是,则增加它。我知道循环和增量的东西...只是不知道它会如何工作...

同样,我知道我哪里出错了,但这是我能想到的唯一解决方案。我只是检查是否有[0],如果没有创建它。如果有[0],我创建[1]。

foreach ( $attachments as $attachment ) {

  $parent_id = $attachment->post_parent;
  $title = $attachment->post_title;
  $type  = $attachment->post_mime_type;

  if ($type == 'audio/ogg') {
    if (!$playlist_all[$parent_id][0]['ogg']) {
      $playlist_all[$parent_id][0]['ogg'] = $attachment->guid;
    } else {
      $playlist_all[$parent_id][1]['ogg'] = $attachment->guid;
    }
  } elseif ($type == 'audio/mpeg') {
    if (!$playlist_all[$parent_id][0]['mp3']) {
        $playlist_all[$parent_id][0]['mp3'] = $attachment->guid;
    } else {
        $playlist_all[$parent_id][1]['mp3'] = $attachment->guid;
    }
  }
}

我希望它清晰明了,它的代码很混乱,但是我让它发挥作用。好吧,50%。

提前致谢。

2 个答案:

答案 0 :(得分:1)

在第一个内部运行第二个foreach循环,并调试$playlist的内容。我非常确定你可以在数据库级别上做到这一点。

foreach ($attachments as $attachment) {

    $parent_id = $attachment->post_parent;
    $title = $attachment->post_title;
    $type = $attachment->post_mime_type;

    foreach ($playlist_all[$parent_id] as $playlist) {
        if ($type == 'audio/ogg') {
            // ...
        } elseif ($type == 'audio/mpeg') {
            // ...
        }
    }
}

答案 1 :(得分:1)

未经测试(没有数据很难做到),但这样的事情应该有效

foreach($attachments as $attachment) {

    $parent_id = $attachment->post_parent;
    $title     = $attachment->post_title;
    $type      = $attachment->post_mime_type;
    $ext       = $type === 'audio/ogg' ? 'ogg' : 'mp3';
    $arr       = $playlist_all[$parent_id];

    for ($i=0; $i<=count($arr); $i++) {
        if (!(array_key_exists($i, $arr) && array_key_exists($ext, $arr[$i]))) {
            $arr[$i][$ext] =  $attachment->guid;
            break;
        }
    }
}

它将数组中索引的数量加1,然后检查它们中的每一个,数组中不存在的最后一个数字将确保写入该值,但是如果有一个索引,文件扩展名没有t已经存在,而是写在那里,然后打破循环。