【问题标题】:check if value from a foreach loop is in an array检查来自 foreach 循环的值是否在数组中
【发布时间】:2014-03-17 20:51:24
【问题描述】:

好吧,我被严重卡住了,我一直在研究导航菜单,但我无法按照我想要的方式运行,所以我已经改变了策略,但现在又卡住了,所以任何帮助都将不胜感激急需!

我有下面的代码,并正在尝试执行以下操作 - 我有一个包含网站所有页面信息的数组,然后是另一个包含子页面页面 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 的函数,然后递归地运行它,直到没有更多页面要显示。我试图编写如下代码块中的 pusdo 代码所示的函数,但我无法让它工作。我可能混淆了一些参数或参数,或者我只是在某个地方犯了一个大错误,但我看不到它 - 任何帮助都会非常感激和迫切需要!

 <?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";
        }; ?>

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

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

【问题讨论】:

  • 您可能还需要遍历 $c 的内容,但是由于我看不到 $c(子页面)中的数据是如何构造的,所以我无法编写示例。 childpages 数组是什么样的?
  • 我编辑了上面的帖子并添加了数组的结构和内容
  • $childpages 是一个数组吗?
  • 您能否整理一个示例来运行并显示在 sandbox.onlinephpfunctions.com 上没有按预期工作的内容?
  • 从技术上讲,$childPageArray 是数组,我使用 $childpages 通过调用像这样的函数将它传递给函数 - 我很可能犯了一些愚蠢的错误,因为我已经做了这么长时间了,现在我有点糊涂了!

标签: php arrays function foreach


【解决方案1】:

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

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

或者 PHP >= 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
    }
}

【讨论】:

  • 哈哈,我想我大约在 6 小时前就有了这个,只是我在 $id 和 $child['id'] 之间有一个 = ,所以我会试一试,看看它是否有什么作用需要
  • 第二个看起来非常吸引人,因为我认为我稍后需要在代码中使用递归循环,当我有多个 foreach 循环时,我一直在努力解决这个问题,我只是还没有能够让它正常工作
  • 我仍在尝试访问 $childpages 数组,但似乎无法使其工作。出于某种原因,似乎没有任何结果 foreach ($childpages as $child){$d = $child['id'];print_r ($d)}; child['id'] 的值似乎是空白的,我想知道这是否是因为 id 键是数组中的第二级,例如数组 => 键 => 数组 => ID => 值。这会有什么不同吗?真正令人困惑的是,相同的结构似乎适用于 $a = $pages['parentid'] 并且该数组与子数组具有相同的结构,您怎么看?
  • 鉴于您发布的数组,foreach ($childpages as $child){ echo $child['id']; } 可以正常工作。
  • 我已经更新了我的代码以显示我目前正在使用的内容。它现在按预期工作,直到我尝试循环它。我需要循环函数来递归检查子级别并带出任何子页面,但我似乎无法破解 - 你有什么建议吗?非常感谢
【解决方案2】:

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
    }

【讨论】:

  • 谢谢-我只是在尝试,我想我可能需要重新调整一下,所以最后一点是 if (!$found){ 做某事,但无论哪种方式,这可能是我的会需要。我试试看!
  • 我仍在尝试访问 $childpages 数组的内容,但它不起作用。我已经按照您的建议尝试使用 $c 作为 $id => $value 但这似乎没有返回任何结果 - 例如,如果我 print_r ($value) 它没有显示任何内容。例如, $c as $value 然后 $d=$value['id'] 也不起作用。有什么建议吗?
  • var_dump($c) 设置后并确保它确实包含您认为应该包含的内容
  • 感谢我使用 var_dump 来帮助显示正在发生的事情,并且现在有了代码来执行我想要的操作,但我现在需要对其运行递归循环,以便它返回并检查更多子页面并在相关的地方显示它们,但我无法让循​​环工作。我已经更新了上面的代码,想知道你是否可以帮忙?这已经让我发疯了一个多星期了!
【解决方案3】:

根据THIS SO ANSWERarray_key_exists 是(几乎)最快的 php 数组查找。

因为,根据您的描述,假设 [id] 是主键并且因此是唯一的似乎是合理的,我将更改 [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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2016-11-08
    • 2021-01-22
    相关资源
    最近更新 更多