我有这个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
相同答案 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_exists
或isset
检查,但不要in_array
,只检查值。