切片foreach循环还是将其转换为for循环?

时间:2018-11-15 22:38:43

标签: php arrays for-loop foreach

我创建了一个自定义帖子类型,并使用CMB2向其添加文件上传选项,该选项允许上传多个文件。我在single.php文件中使用以下代码来输出所有已上传的文件。

$files = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $files != '' ) {
echo '<div class="ad-photos">';
// Loop through them and output an image
foreach ( (array) $files as $attachment_id => $attachment_url ) {
    echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
}
echo '</div>';
}

该代码运行良好。现在,我需要一个仅输出已上传的第一个文件的代码。我已经对此进行了广泛的搜索,并提出了许多不同的方法来实现此目的。据我所知,最好的方法是使用array_slice。我已经阅读了关于array_slice的所有内容,并尝试了各种方法,但是对于我一生来说,我不知道如何将其实现到我那里的代码中。

这是我最好的逻辑尝试:

$otherfiles = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $otherfiles != '' ) {
// Loop through them and output an image
$otherfiles = array_slice( $otherfiles, 0,1);
foreach ( $otherfiles as $attachment_id => $attachment_url ) {
    echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
}
}

似乎让我接近了,因为它确实导致它仅循环一次,但实际上并没有获取文件url。它只是输出一个空的<a>标签。

我觉得我只是在这里缺少一些简单的东西,但是我已经阅读了所有可以找到的内容,并尝试了所有我能想到但无法弄清楚的内容。上面的代码是我从许多不同方法中得到的最接近的代码。

感谢您在正确方向上的帮助或推动。而且,如果有更好的方法可以做到这一点,我将不知所措!我也尝试过使用for循环,因为有人说这是一个更好的选择,但是我还无法弄清楚如何将我拥有的代码修改为for循环。因此,如果有人可以告诉我该怎么做,我将不胜感激。我从CMB2文档中复制了我正在使用的代码,我只是不太了解它以至于无法正确地对其进行修改。

2 个答案:

答案 0 :(得分:0)

Few options

1. Use Break

$files = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $files != '' ) {
    echo '<div class="ad-photos">';
    foreach ( (array) $files as $attachment_id => $attachment_url ) {
        echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
        break; // Stops Execution after the first time
    }
    echo '</div>';
}

2. Use Array Keys and only get the first one

$files = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $files != '' ) {
    echo '<div class="ad-photos">';
    $attachment_id = array_keys((array) $files)[0];
    echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
    echo '</div>';        
}

BTW, it doesn't look like you need the $attachment_url variable as you're actually getting the URL from a subsequent function wp_get_attachment_url()

答案 1 :(得分:0)

我认为您正在寻找的只是:

reset($theArray);