0

私が直面している問題は、あるforeachを別のforeach内で使用し、最初のforeachの配列に複数のエントリがある場合です。私がやりたいのは、配列1のすべてのエントリを配列2から除外することです。私はほとんどすべての関連する投稿に参加しており、自分で解決することはできません。可能であれば少し助けが必要です。英語が下手でごめんなさい。

例:

$choice--->毎回ランダムな数のエントリを持つ配列(この例では2)

例:

/var/www/clients/client1/web1/web/images,/var/www/clients/client1/web1/web/tmp

$list--->毎回ランダムな数のエントリの配列(この例では10000)

例:

/var/www/clients/client1/web1/web/images,/var/www/clients/client1/web1/web/tmp,/var/www/clients/client1/web1/web/includes,/var/www/clients/client1/web1/web/libraries,......

$list常により多くのエントリがあります$choice

そして、私はここにこのコードを持っています:

foreach ( $choice as $select )
{
    foreach ( $list as $file )
    {
        if ( (strpos( $file, $select )) !== false ) 
        {
            // exclude this
        }
        else
        {
            // include this
        }
    }
}

上記のコードは(残念ながら)次のようになります。

$select手順1.エントリ1をすべてのエントリと比較し$fileます。

$select手順2.すべてのエントリからエントリ1を除外$fileし、$selectエントリ2を含めます。

ステップ3.$selectエントリー2をすべての$fileエントリーと比較します。

$select手順4.すべてのエントリからエントリ2を除外$fileし、$selectエントリ1を含めます。

結果:除外されるものはありません。

どんな助けでも本当に感謝します。私は一週間ほどこれに取り組んでいます、私が試したのはそれらを裏返しにすることだけです私はアイデアから外れています。ありがとうございました。

4

1 に答える 1

1

$list にある項目を $choice から削除しようとしているようです。(それとも逆ですか?) array_diff関数は試しましたか? これは、両方の配列の項目が等しい場合に機能します。例えば:

<?php

//Option 1: array_diff
$bigger = array("A", "B", "C", "D", "E", "F");
$smaller = array("A", "B");

$result = array_diff($bigger, $smaller);
print_r($result);

削除されたアイテムに対して追加の処理を行う必要がある場合は、in_arrayを試すことができますが、これにはアイテムの等価性が必要です (上記のように)。例えば:

//Option 2: in_array (only one foreach loop)
foreach ($smaller as $key => $item) {
    if (in_array($item, $bigger)) {
        //do something to "remove" it, for example:
        unset($smaller[$key]);
        unset($bigger[$key]);
        //...
    }
}
print_r($smaller);
print_r($bigger);

最後に、両方の配列の項目が厳密に等しいことが保証されていない場合は、二重の foreach を使用できます。内側のループでアイテムにフラグを立て、外側のループでそれらを処理する必要があります。例えば:

//Option 3: double-foreach (items not strictly equals)
$choice = array(
    "/var/www/clients/client1/web1/web/images",
    "/var/www/clients/client1/web1/web/tmp"
);

$list = array(
    "/var/www/clients/client1/web1/web/images",
    "/var/www/clients/client1/web1/web/tmp",
    "/var/www/clients/client1/web1/web/includes",
    "/var/www/clients/client1/web1/web/libraries",
    // more items
);


foreach ($choice as $choice_key => $choice_item) {
    $exists_in_list = FALSE;
    foreach ($list as $list_key => $list_item) {
        if (strpos($list_item, $choice_item) !== FALSE) {
            //$choice_item is string-contained inside $list_item:
            $exists_in_list = TRUE;

            //Do some processing on $list (while "$list_key" is in scope). For example:
            unset($list[$list_key]); //removes the matching items from $list
            //...

            break;
        }
    }
    if ($exists_in_list) {
        //Do post-processing on $choice. For example:
        unset($choice[$choice_key]); //removes the matching items from $choice
        //...
    }
}

echo '$choice is now ';
print_r($choice);

echo '$list is now ';
print_r($list);

$結果は次のとおりです。

//Option 1:
Array //$result == $bigger - $smaller
(
    [2] => C
    [3] => D
    [4] => E
    [5] => F
)

//Option 2:
Array //$smaller - $bigger
(
)
Array //$bigger - $smaller
(
    [2] => C
    [3] => D
    [4] => E
    [5] => F
)

//Option 3:
$choice is now Array
(
)
$list is now Array
(
    [2] => /var/www/clients/client1/web1/web/includes
    [3] => /var/www/clients/client1/web1/web/libraries
)
于 2012-08-06T22:23:24.960 に答える