0

例如,我有这个 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一样

4

2 回答 2

2

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

if (array_key_exists("index", $value) && (in_array("primary", $value["index"]) || in_array("unique", $value["index"]))) {
    $arr[] = $key;
}
于 2013-06-11T13:28:30.990 回答
1
in_array("index", $value)

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

利用:

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

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

所以,使用array_key_existsorisset检查,但不是in_array只检查值。

于 2013-06-11T13:33:01.297 回答