0

まず第一に、私の基本的なPHPスキルが、基本的または些細なことを尋ねるように私を駆り立てた場合、すみませんが、結果なしでサイトを検索しました(おそらく、そのようなものの専門用語がわからないためです..)

ループごとにネストされていますが、単純な変数($e)に基づいて、ループ全体(2つのネストされた部分)を使用するか、1つ(内部)のみを使用する必要があります。

   $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...

                        }
                }
            }

だから今私はandを使ってこれを解決しましたswitch $e:-case しかしそれは私のコードの長さを複製するよりももっと重要です、なぜなら私がしたことはネストされたループ全体として1つのケースを作り、もう1つのケースは-唯一の内側のループ(これはloooongです) ..)コード全体をコピーして「」に貼り付けることなく、このような場合に使用できる忍者テクニックがあると確信していますが、caseどのようにすればよいかわかりません。

誰 ?

注:おそらく外部関数を使用できることはわかっていますが、問題は、非常に長い2番目(内部)のループで、言語出力(HTML)がわずかに変化する1つまたは2つのマイナーなケースがあることです。

編集I-コメントからの不明確さのために、ここにコードがあります(ループが大幅に削減されています-実際のループははるかに長くなっています)-質問には関係ありませんが。コードはワードプレスに関連しています。

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投稿経由????

スクリプトがこのエラーを処理する方法はありません..関数を改善する方法についてのガイドを提供します

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配列であり、配列のみがtrueと評価されるため、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ループから抜け出すことができます。また、ここでは、内部ループの各反復で$dを上書きしています。foreach ($c as $d)

于 2012-10-28T21:53:40.473 に答える