PHP json string:获取关联数组对象

时间:2015-04-27 16:45:17

标签: php arrays json

我有一个包含这样数据的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;
        }
}

我已经搜索了一堆其他问题,但没有发现足够接近问题的东西。

附加信息:我可能知道也可能不知道“州”字符串(即“阿拉斯加”),但我可能希望根据找到的值返回此信息。

感谢您的帮助。

2 个答案:

答案 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”键的列表或关联数组