动态检查PHP数组中的字符串

时间:2017-10-03 18:02:43

标签: php arrays

编辑:十个月后,我仍然回到这个......仍然无法弄明白:(

我可以在数组中搜索字符串没问题;这有效:

if (in_array('animals', $value[tags])){
   echo "yes";
}

但是如何检查数组中的变量?这似乎不起作用:

$page_tag = 'animals';
if (in_array($page_tag, $value[tags])){
   echo "yes";
}

我猜我错过了一些简单的语法doodad?

阵列非常庞大,所以我会尝试展示它的样本。它存储在一个单独的php文件中,并“包含”在其他地方。

global $GAMES_REPOSITORY;
$GAMES_REPOSITORY = array   (
     "Kitten Maker"      => array   (
        "num"   => "161",
        "alt"   => "Kitten Maker animal game",
        "title" => "Create the kitten or cub of your dreams!",
        "tags"  => array ("animals", "feline", "cats", "mega hits"),
     ),
}

这是代码的更大部分,放入上下文中。它从大约400个游戏的数组中拉出来,然后拉出具有特定标记的游戏:

function array_subset($arr) {
    $newArray = array();
    foreach($arr as $key => $value) {
        if (in_array($page_tag, $value["tags"])){
            if(is_array($value)) $newArray[$key] = array_copy($value);
            else if(is_object($value)) $newArray[$key] = clone $value;
            else $newArray[$key] = $value;
        }
    }
    return $newArray;
}
function array_copy($arr) {
    $newArray = array();
    foreach($arr as $key => $value) {
        if(is_array($value)) $newArray[$key] = array_copy($value);
        else if(is_object($value)) $newArray[$key] = clone $value;
        else $newArray[$key] = $value;
    }
    return $newArray;
}
$games_list = array();
$games_list = array_subset($GAMES_REPOSITORY);
$games_list = array_reverse($games_list);

哦,一个有趣的暗示。在其他地方,它使用$ _GET工作:

if (in_array($_GET[tagged], $value[tags])){

3 个答案:

答案 0 :(得分:1)

in_array()函数可以检查变量,因此您的问题很可能来自其他地方。确认您已正确定义了常量标记。如果没有定义,则可能不起作用,具体取决于您的PHP版本。有些版本只是假设您要编写字符串标记而不是名为标记的常量。

您的代码有效。以下是我测试过的完整示例:

<?php
const tags = "tags";
$page_tag = 'animals';
$value = array('tags' => array("fruits", "animals"));

if (in_array($page_tag, $value[tags])){
   echo "yes";
}

答案 1 :(得分:1)

你有一个数组数组,所以in_array()不会工作,因为你已经将它编写为数组中存在的测试,而不是子数组。您也可以像这样循环遍历数组:

foreach($GAMES_REPOSITORY as $name =>$info) {
   if(in_array($page_tag, $info['tags']))
   {  whatever  } 
}

如果速度不够快,则必须通过提前循环并创建标记索引来缓存标记。

答案 2 :(得分:1)

我终于可以正常工作了!我不完全理解为什么,但是我不得不直接将变量输入函数。由于某种原因,它不会从父函数中提取变量。但是现在它可以工作了,甚至需要两个动态变量:

function array_subset2($arr, $tag1, $tag2) {
    $newArray = array();
    foreach($arr as $key => $value) {
        if (in_array($tag1, $value['tags'])){
            if (in_array($tag2, $value['tags'])){
                if(is_array($value)) $newArray[$key] = array_copy2($value);
                else if(is_object($value)) $newArray[$key] = clone $value;
                else $newArray[$key] = $value;
            }
        }
    }
    return $newArray;
}
function array_copy2($arr) {
    $newArray = array();
    foreach($arr as $key => $value) {
        if(is_array($value)) $newArray[$key] = array_copy2($value);
        else if(is_object($value)) $newArray[$key] = clone $value;
        else $newArray[$key] = $value;
    }
    return $newArray;
}
$games_list = array();
$games_list = array_subset2($GAMES_REPOSITORY, $page_tag, $featured_secondary_tag);