嵌套的foreach与数组 - PHP

时间:2012-08-06 22:16:54

标签: php arrays foreach

我面临的问题是当我在另一个foreach中使用一个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.将$select条目1与所有$file条目进行比较。

步骤2.将从所有$select条目中排除$file条目1,并将包含$ select条目-2。

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

步骤4.将从所有$select条目中排除$file条目-2,并将包含$ select条目-1。

结果: 没有排除。

真正感谢任何帮助。我这样做了一个星期,我所尝试的只是把它们放在里面我没有想法。 谢谢。

1 个答案:

答案 0 :(得分: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);

$ result是:

//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
)