我面临的问题是当我在另一个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。
结果: 没有排除。
真正感谢任何帮助。我这样做了一个星期,我所尝试的只是把它们放在里面我没有想法。 谢谢。
答案 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
)