0

首先 - 如果我的基本 PHP 技能促使我询问一些可能是基本或微不足道的问题,但我搜索了该站点但没有结果(可能是因为我不知道这种事情的技术术语..),请原谅我

我为每个循环都有一个嵌套,但基于简单的变量($e),我需要使用整个循环(2 个嵌套部分)或只使用一个(内部)。

   $a = array(); //some array ...
   $c = array(); //some other array ...
   $e = 'yes' // or 'no'

    if ($a) {
                foreach ($a as $b) {

                    $a_1[] = 'something_quite_long'; //that would  affects $c if used

                        foreach ( $c as $d ) {

                        //do_something_very long...

                        }
                }
            }

所以现在我已经通过使用switch $e:and解决了这个问题case - 但这比我的代码长度重复更多,因为我所做的是将一个情况作为整个嵌套循环,而另一种情况 - 唯一的内部循环(这是 loooong ..) 我确信在这种情况下可以使用一些忍者技术,而无需简单地将整个代码复制并粘贴到“ case”中 - 但我不知道如何。

任何人 ?

注意:我知道我大概可以使用外部函数,但问题是在很长的第二个(内部)循环中 - 有一个或两个小情况,其中口头输出(HTML)会略有变化..

编辑 I - 由于评论不明确,这里是代码(循环大大减少 - 实际循环更长) - 尽管与问题无关。该代码与wordpress相关..

function o99_get_image_size_links($title='',$single,$recieved_id) {

    /* If not viewing an image attachment page, return. */


    /* Set up an empty array for the links. */
    $links = array();

    /* Get the intermediate image sizes and add the full size to the array. */
    $sizes = get_intermediate_image_sizes();

    $sizes[] = 'full';

    global $post;

    switch ($single) {

    case 'FALSE':

    // this will do to all images attached to a post ..
    $attachments = get_children( array('post_parent' => $post->ID, 'post_status' => 'inherit', 'post_type' => 'attachment','post_mime_type' => $mime, 'order' => 'ASC', 'orderby' => 'menu_order ID', 'posts_per_page'=>$limit) );

    /* Loop through each of the image sizes. */

        if ($attachments) {

            foreach ($attachments as $att) { 


                $links[] = '<br>' . get_the_title($att->ID) .' || '. basename ( get_attached_file( $att->ID ) ).' || '. $att->post_name .' || ' /*. wp_get_attachment_image( $att->ID, 'tooltip' ).' || ' .'<br/>'*/  ; // k99 add

                if ($title) {
                    $links[] = '<br><b>' . $title . '</b></br>';
                    }

                    foreach ( $sizes as $size ) {

                        /* Get the image source, width, height, and whether it's intermediate. */

                        $image = wp_get_attachment_image_src( $att->ID, $size );

                        /* Add the link to the array if there's an image and if $is_intermediate (4th array value) is true or full size. */

                        if ( !empty( $image ) && ( true == $image[3] || 'full' == $size ) )

                            $links[] = "</br><a class='image-size-link_{$image[1]}&times;{$image[2]}' href='{$image[0]}'>{$image[1]} &times; {$image[2]}</a>";
                    }
            }
        }

break;

//case for single image ..

case 'TRUE':

                $links[] = '<br>' . get_the_title($recieved_id) .' || '. basename ( get_attached_file( $recieved_id ) ).' || '. $att->post_name .' || ' /*. wp_get_attachment_image( $att->ID, 'tooltip' ).' || ' .'<br/>'*/  ; // k99 add

                if ($title) {
                    $links[] = '<br><b>' . $title . '</b></br>';
                    }

                    foreach ( $sizes as $size ) {

                        /* Get the image source, width, height, and whether it's intermediate. */

                        $image = wp_get_attachment_image_src( $recieved_id, $size );

                        /* Add the link to the array if there's an image and if $is_intermediate (4th array value) is true or full size. */

                        if ( !empty( $image ) && ( true == $image[3] || 'full' == $size ) )

                            $links[] = "</br><a class='image-size-link_{$image[1]}&times;{$image[2]}' href='{$image[0]}'>{$image[1]} &times; {$image[2]}</a>";
                    }
break;
}
    /* Join the links in a string and return. */


    return join( '<span class="sep"> /</span> ', $links );

}
4

3 回答 3

2

我的代码有很多问题..但这是为了让您了解如何最小化您的代码

问题

  • 使用全局global $post;
  • $mime并且$limit没有声明
  • basename ( get_attached_file( $recieved_id ) ).' || '. $att->post_name .' || '在定义的循环之外foreach ($attachments as $att)
  • $recieved_idvar 参数和$post->ID通过 post ????
  • ETC

您的脚本无法处理此错误..所以我只会为您提供有关如何改进功能的指南

function k99_get_image_size_links($title = '', $single ,  $recieved_id , $mime =null , $limit = null) {
    $links = array();
    $sizes = get_intermediate_image_sizes();
    $sizes[] = 'full';
    $pad = function ($ID) use(&$links,$sizes,$title) {
        $links[] = '<br>' . get_the_title($ID) . ' || ' . basename(get_attached_file($ID)) . ' || ' . $title  . ' || ' ;
        empty($title) OR $links[] = sprintf('<br><b>%s</b></br>',$title);
        foreach ( $sizes as $size ) {
            $image = wp_get_attachment_image_src($ID, $size);
            if (! empty($image) && (true == $image[3] || 'full' == $size))
                $links[] = sprintf('</br><a class="image-size-link_%s&times;%s" href="%s">%1$s &times; %2$s</a>',$image[1],$image[2],$image[0]);
        }
    };

    if ($single === true) {
        $pad($recieved_id);
    } else {
        $attachments = get_children(array('post_parent' => $recieved_id,'post_status' => 'inherit','post_type' => 'attachment',
                                          'post_mime_type' => $mime,'order' => 'ASC','orderby' => 'menu_order ID','posts_per_page' => $limit));
        if ($attachments) {
            foreach ( $attachments as $att ) {
                $pad($att->ID);
            }
        }
    }
    return join('<span class="sep"> /</span> ', $links);
}

请注意,上面的代码没有经过测试,只是为了向您展示如何Closure在代码中使用删除重复项

于 2012-10-28T22:29:21.120 回答
0

一些注意事项:

if ($a) {
            foreach ($a as $b) {

由于$a是一个数组,并且只有一个数组在 中评估为真,所以if您根本不需要ifforeach将对空数组进行零次迭代,因此if是多余的。

   $d = 'yes' // or 'no'

   ...
                        foreach ( $c as $d ) {
                                        ^^^

您正在覆盖$d此处的变量。这可能会导致你的问题。让我们清理代码回顾一下:

$a = array(); //some array ...
$c = array(); //some other array ...
$e = 'yes' // or 'no'

foreach ($a as $b)
{
    $a_1[] = 'something_quite_long'; //that would  affects $c if used
    foreach ($c as $d)
    {
        // do_something_very long...
    }
}

如果您现在给变量起更好的名称,循环应该会变得更清晰,从而减少出错的地方。

于 2012-10-28T21:51:02.303 回答
0

break;您可以使用跳出循环并继续下一步的命令跳出 foreach 循环,在您的代码中是外循环的下一次迭代。此外,您在这里的内部循环的每次迭代中都会覆盖 $dforeach ($c as $d)

于 2012-10-28T21:53:40.473 回答