检查来自foreach循环的值是否在数组中

时间:2014-03-17 20:51:24

标签: php arrays function foreach

好的,我严重陷入困境,我一直在制作一个导航菜单,我无法按照我想要的方式运行,所以我已经改变了方向,但现在再次陷入困境帮助将非常感激和迫切需要!

我有下面的代码并尝试执行以下操作 - 我有一个数组,其中包含网站所有页面的信息,然后是另一个包含子页面的ID的数组。我想要做的是使用foreach循环遍历第一个数组的所有页面,并检查它们的id是否在子ID的数组中。如果它们不是那么它们是顶级导航页面,我想输出一些代码,然后设置另一个foreach循环,它将检查是否有任何子页面具有当前页面的父ID,依此类推。

无论我尝试什么,我似乎无法弄清楚如何将$ b与$ childpages数组中的id进行比较!这有可能吗?如果是这样,请问怎么样?

这是我目前正在尝试的第一部分

<?php function buildMenu4 ($allpages, $childpages) {

    foreach ($allpages as $pages){

    $a = $pages['parentid'];
    $b = $pages['id'];
    $c = $childpages;


    echo "<ul>\n";



        if (!in_array($b, $c)) {

        DO SOMETHING..........

$ c的数组内容:

Array 
( 
[0] => Array ( [id] => 6 ) 
[1] => Array ( [id] => 15 ) 
[2] => Array ( [id] => 100 ) 
[3] => Array ( [id] => 101 ) 
[4] => Array ( [id] => 103 ) 
[5] => Array ( [id] => 104 ) 
[6] => Array ( [id] => 105 ) 
)

编辑---------------------------------

我已经重新编写了代码,并且回到了几天前我所处的变化!无论如何,下面的代码按预期工作,直到我尝试循环它然后它只是回应第一个foreach循环的结果,例如foreach($ allpages as $ pages){.....但没有做任何其他事情。

我正在尝试创建一个名为loopMenu的函数,然后以递归方式运行此函数,直到不再显示任何页面为止。我试着在下面的代码块中用pusedo代码编写函数,但是我无法让它工作。我可能搞砸了一些论点或参数,或者我在某个地方犯了一个大错,但我无法看到它 - 任何帮助都会得到极大的赞赏和迫切的需要!

 <?php function buildMenu6 ($allpages, $childpageids, $childpages, $subchildpages) {


        foreach ($childpageids as $childid){
            $c[] = $childid['id'];

            };


            echo "<ul>\n";  

        foreach ($allpages as $pages){


        $a = $pages['parentid'];
        $b = $pages['id'];


            if (!in_array($b, $c)){

                echo "<li><a href=" . $pages['url'] . ">" . $pages['linklabel'] . "</a>";


                    WHERE I WANT THE FUNCTION TO START E.G. function loopMenu($childpages, $subchildpages){...the code that follows....


                    echo"<ul>\n";

                    foreach ($childpages as $childparent) {

                            $d = $childparent['parentid'];
                            $e = $childparent['id'];



                            if (($d == $b) or ($d == $g)) {

                                echo "<li><a href=" . $childparent['url'] . ">" . $childparent['linklabel'] . "</a>";
                                    echo "<ul>\n";

                                    foreach ($subchildpages as $subchild){
                                        $g = $subchild['id'];
                                        $f = $subchild['parentid'];


                                        if ($f == $e){

                                            echo "<li><a href=" . $subchild['url'] . ">" . $subchild['linklabel'] . "</a>";
                        WHERE I TRY TO RERUN THE FUNCTION USING loopMenu($childparent, $subchild);                  
                                            echo "<li/>";
                                            };
                                        };

                                    echo"</ul>\n";
                                echo "</li>";

                        };
                    };
                    echo "</ul>\n";


WHERE I WANT MY FUNCTION TO END E.G. };


echo "</li>";

                };


    };
        echo "</ul>\n";
        }; ?>

然后我像这样调用main buildMenu6函数:

<?php buildMenu6($pageids, $childPageIds, $childPageArray, $childPageArray); ?>

3 个答案:

答案 0 :(得分:1)

您需要一个嵌套的foreach(我已更改您的var名称或使用原始名称以提高可读性):

foreach($allpages as $page) {
    foreach($childpages as $child) {
        if($page['id'] == $child['id']) {
            //do something
            break;
        }
    }
}

或PHP&gt; = 5.5.0使用array_column

$childids = array_column($childpages, 'id');

foreach($allpages as $page) {
    if(in_array($page['id'], $childids)) {
        //do something
    }
}

作为一种混合体:

foreach($childpages as $child) {
    $childids[] = $child['id'];
}
foreach($allpages as $page) {
    if(in_array($page['id'], $childids)) {
        //do something
    }
}

答案 1 :(得分:0)

foreach ($allpages as $pages){

$a = $pages['parentid'];
$b = $pages['id'];
$c = $childpages;


echo "<ul>\n";



    // In array isn't aware of the 'id' keys
    $found = false;
    foreach ($c as $id => $value) {
        if ($value == $b) {
             $found = true;
        }
    }

    if ($found) {
        // DO SOMETHING
    }

答案 2 :(得分:0)

根据THIS SO ANSWERarray_key_exists是(边缘)最快的PHP数组查找。

因为,根据您的描述,假设[id]是一个PRIMARY键并因此是唯一的,我会改变[id]维度并将值直接放在其代替中似乎是合理的:

$c[105] = NULL; // or include some value, link page URL
... // some code
$needle = 105;
... // some more code
if (array_key_exists($needle,$c)) {

而不是

$c[5] = 105; // $c is the haystack
... // some code
$needle = 105;
... // some more code
foreach ($c as $tempValue) {
    if ($tempValue == $needle) {

如果你想在$c中放置值,那么你也可以使用isset(如果所述键的数组值为NULL,它将返回FALSE)。