我有一个包含这样数据的json文件(这是显示结构的文件的局部视图):
{
"state": {
"ALABAMA": {
"ZOLD": [ "101", "102" ],
"ZNEW": [ "11", "12" ]
},
"ALASKA": {
"ZOLD": [ "5001", "5002", "5003", "5004", "5005", "5006", "5007", "5008", "5009", "5010"],
"ZNEW": [ "21", "22", "23", "24", "25", "26", "27", "28", "29", "20"]
}
}
}
我想要做的是搜索它以在ZOLD字段中查找值= $ OLD,然后返回相应ZNEW数组的值。我尝试过使用foreach并且可以让阵列回响,但我不确定它的价值。这是我的代码:
function translateZone($OLD)
{
$OLD = "5010"; //for testing purposes a constant but will be variable
$zStr = file_get_contents('getnew.json');
$zJson = json_decode($zStr,true);
foreach($zJson as $key=> $jsons)
{
foreach($jsons as $key=>$values)
{
foreach($values as $key=>$vals)
{
$counter=0;
foreach($vals as $key=>$vls)
{
$counter ++;
echo var_dump($vls);//I can see the values,but now what?
if ($vls == $OLD)
{
$zTemp = Help here -some array value of counter??
}
}
}
return $zTemp;
}
}
我已经搜索了一堆其他问题,但没有发现足够接近问题的东西。
附加信息:我可能知道也可能不知道“州”字符串(即“阿拉斯加”),但我可能希望根据找到的值返回此信息。
感谢您的帮助。
答案 0 :(得分:2)
您可以使用array_search(假设$OLD
值只能在数据中出现一次),而不是尝试遍历ZOLD。此函数将为您搜索的值的索引返回一个数字,如果找不到它,则返回false
:
$index = array_search($OLD,$values['ZOLD']);
if ($index !== FALSE) {
$zTemp = $values['ZNEW'][$index];
}
这会替换你的两个最里面的for循环(因为你需要其他循环来达到这个级别)并迭代每个状态。此时,$key
将被定义为您的州名。
答案 1 :(得分:1)
以下是完成任务的另一种方法,这个方法具有array_map
功能:
$jsonArray = json_decode($your_file_content, true);
$oldVal = "5005";
$result = [];
foreach( $jsonArray["state"] as $k => $v ) {
/**
* Here we're building an array or pairs ZOLD => ZNEW values
*/
$pairs = array_map(function($o, $n) {
return [ $o => $n ];
}, $v["ZOLD"], $v["ZNEW"]);
/**
* Filling up the result
*/
foreach( $pairs as $p )
if( isset($p[$oldVal]) )
$result[] = [
"state" => $k,
"ZNEW" => $p[$oldVal]
];
}
var_dump($result);
如果找到相应的ZNEW值, $result
转储将包含带有“state”和“ZNEW”键的列表或关联数组