如何在PHP中对JSON文件数组的多个列实现一次性搜索
解决方案
你期望的直接给array_column传多个字段提取的写法PHP原生不支持,但可以通过一次遍历数组同时校验三个字段的方式,实现单次搜索完成匹配,比你原来三次调用array_search的写法性能更好,尤其在JSON数据量较大的时候优势更明显。
另外需要注意你原有代码的逻辑漏洞:array_search如果匹配到数组的第0个元素会返回整数0,直接用if($name_key1)判断会把合法的0结果当成布尔false跳过,导致匹配失败。
下面是两种常用的实现方案:
方法1:用array_filter一次性筛选所有匹配项
如果需要拿到所有符合条件的条目,可以用这个方法:
$nameOrIDOrSymbol = "apple"; $names = json_decode(file_get_contents("file.json", true), true); // 一次遍历同时校验三个字段 $matchedItems = array_filter($names, function($item) use ($nameOrIDOrSymbol) { return $item['id'] === $nameOrIDOrSymbol || $item['name'] === $nameOrIDOrSymbol || $item['symbol'] === $nameOrIDOrSymbol; }); // 输出所有匹配到的结果 var_dump($matchedItems); // 如果只需要第一个匹配项的键,可以这么取 $firstMatchedKey = $matchedItems ? array_key_first($matchedItems) : false; var_dump($firstMatchedKey);
方法2:用foreach遍历找到第一个匹配就终止(性能最优)
如果只需要第一个匹配的结果,用foreach遍历到匹配项就跳出,不需要遍历整个数组,资源消耗最低:
$nameOrIDOrSymbol = "apple"; $names = json_decode(file_get_contents("file.json", true), true); $matchedKey = false; foreach ($names as $key => $item) { if ($item['id'] === $nameOrIDOrSymbol || $item['name'] === $nameOrIDOrSymbol || $item['symbol'] === $nameOrIDOrSymbol) { $matchedKey = $key; break; // 找到就终止,不需要继续遍历 } } var_dump($matchedKey);
内容的提问来源于stack exchange,提问作者Amin Arjmand - امین ارجمند
相关产品推荐
相关产品推荐

