0

我面临的问题是当我在另一个中使用一个 foreach 并且第一个 foreach 的数组有超过 1 个条目时。我想要做的是从数组2中排除数组1的所有条目。我几乎在所有相关的帖子上,无法自己解决,如果可能的话我需要一点帮助。对不起,我的英语不好。

例子:

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

上面的代码会做什么(不幸的是)是:

步骤 1. 将$selectentry-1 与所有$file条目进行比较。

$select第 2 步。将从所有条目中排除条目 1 $file,并将包括 $select 条目 2。

步骤 3. 将$selectentry-2 与所有$file条目进行比较。

$select第 4 步。将从所有条目中排除条目 2 $file,并将包括 $select 条目 1。

结果:没有排除任何东西。

任何帮助真的很感激。我在这方面待了一个星期,我所尝试的只是把它们从里面拿出来,我没有想法。谢谢你。

4

1 回答 1

1

我相信您正在尝试从 $choice 中删除 $list 中的项目。(或者相反?)你试过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 回答