【问题标题】:Slice a foreach loop or convert it to a for loop instead?切片 foreach 循环或将其转换为 for 循环?
【发布时间】:2023-08-16 09:14:01
【问题描述】:

我创建了一个自定义帖子类型,并使用 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。它只是输出一个空的&lt;a&gt; 标签。

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

感谢您向正确方向提供任何帮助或推动。如果有更好的方法来实现这一点,我会全力以赴!我也尝试过使用for 循环,因为有些人说这是一个更好的选择,但我无法弄清楚如何将我拥有的代码修改为for 循环。因此,如果有人能告诉我如何做到这一点,我将不胜感激。我从 CMB2 文档中复制了我正在使用的代码,但我只是不太了解它,无法正确修改它。

【问题讨论】:

  • 可以分享一下$otherfiles开头的内容吗? (var_dump it)如果你只需要第一个文件(第一个键为$attachment_id),你可以使用*.com/questions/1028668/…
  • 为什么不只是做你的工作foreach(),而是在回显之后简单地break,以便它只在数组的第一个元素中运行一次?

标签: php arrays for-loop foreach


【解决方案1】:

几个选项

1.使用中断

$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。使用数组键,只获取第一个

$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>';        
}

顺便说一句,看起来您不需要 $attachment_url 变量,因为您实际上是从后续函数 wp_get_attachment_url() 获取 URL

【讨论】:

  • Break 完全符合我的需要,而且非常简单,谢谢!
【解决方案2】:

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

reset($theArray);

【讨论】: