in_array和isset给出不同的结果?

时间:2013-06-11 13:26:34

标签: php arrays

我有这个json文件,例如,我的用户有一些表元数据。

{
    "id": {
        "index": ["primary", "auto_increment"],
        "unsigned": true,
        "type": "integer"
    },
    "nick": {
        "index": ["unique"],
        "type": "varchar",
        "minLength": 4,
        "maxLength": 10
    },
    "pw": {
        "type": "varchar",
        "minLength": 4,
        "maxLength": 10
    }
}

我检查一个字段是否是索引以及它是什么类型的索引。


如果我按照这种方式进行检查在foreach

if (isset($value["index"]) && (in_array("primary", $value["index"]) || in_array("unique", $value["index"]))) {
    $arr[] = $key;
}

我按预期得到了这个结果

Array
    (
        [0] => id
        [1] => nick
    )

但如果我这样做在foreach

if (in_array("index", $value) && (in_array("primary", $value["index"]) || in_array("unique", $value["index"]))) {
    $arr[] = $key;
}

我得到了这个结果......

Array
    (
        [0] => id
    )

这有点令人毛骨悚然。有谁知道为什么?我不懂。在我看来,* in_array-sample *必须与 isset-sample

相同

2 个答案:

答案 0 :(得分:2)

in_array不检查密钥,它会检查值。 isset方法工作正常且速度很快,或者您可以

if (array_key_exists("index", $value) && (in_array("primary", $value["index"]) || in_array("unique", $value["index"]))) {
    $arr[] = $key;
}

答案 1 :(得分:1)

in_array("index", $value)

in_array有第三个参数用于检查类型,并且不进行松散的比较。并且当您的第二个数组的条目"unsigned": true"index" == true为真时。

使用:

in_array("index", $value, true);

你不会看到任何结果。因为没有值"index"

因此,请使用array_key_existsisset检查,但不要in_array,只检查值。