搜索数组以返回子值的键的最佳方法是什么

时间:2014-05-19 23:30:18

标签: php arrays json

我正在尝试过滤一个数组(从json对象派生),以便根据该值返回数组键。我不确定数组搜索{​​{1}}是否是最好的方法(我无法使其工作),我认为必须有更好的方法。

到目前为止,我已经有了这个,但它没有用。感谢任何帮助!

$key = array_search($value, $array);

该数组包含从nestoria api取得的平均房产价格如下: http://api.nestoria.co.uk/api?country=uk&pretty=1&action=metadata&place_name=Clapham&price_type=fixed&encoding=json

这将返回一个长json对象。我的问题是数据不一致 - 我正在寻找最快(运行时)的方式来执行以下操作:

    public function getBedroomData(array $data,$num_beds = null,$type) {

    $data = (array) $data;

    if($num_beds > 0) {
        $searchstring = "avg_".$num_beds."bed_property_".$type."_monthly";
        } else {
        $searchstring = "avg_property_".$type."_monthly";
        }

        $avg_string = array_search($data, $searchstring);
    return $avg_string;             
    }

根据我的计算结果,无法按卧室数量过滤初始搜索查询。所以,我只是对输出进行数组切片以获取我选择卧室时所需的信息,但由于数据不一致,这往往会失败。

1 个答案:

答案 0 :(得分:0)

要在nestoria中搜索特定的json响应,可以使用简单的foreach循环。首先,当然要调用您需要的json数据。然后,提取整个数据,下一步如果非常简单。考虑这个例子:

$url = 'http://api.nestoria.co.uk/api?country=uk&pretty=1&action=metadata&place_name=Clapham&price_type=fixed&encoding=json';
$contents = file_get_contents($url);
$data = json_decode($contents, true);
$metadata = $data['response']['metadata'];

// dummy values
$num_beds = 1; // null or 0 or greater than 0
$type = 'buy'; // buy or rent

function getBedroomData($metadata, $num_beds = null, $type) {
    $data = array();

    $searchstring = (!$num_beds) ? "avg_property_".$type."_monthly" : "avg_".$num_beds."bed_property_".$type."_monthly";
    $data['metadata_name'] = $searchstring;
    $data['data'] = null;

    foreach($metadata as $key => $value) {
        if($value['metadata_name'] == $searchstring) {
            $raw_data = $value['data']; // main data

            // average price and data points
            $avg_price = 0;
            $data_points = 0;
            foreach($raw_data as $index => $element) {
                $avg_price += $element['avg_price'];
                $data_points += $element['datapoints'];
            }
            $data_count = count($raw_data);
            $price_average = $avg_price / $data_count;
            $data_points_average = $data_points / $data_count;

            $data['data'][] = array(
                'average_price' => $price_average,
                'average_datapoints' => $data_points_average,
                'data' => $raw_data,
            );
        }
    }

    return $data;
}

$final = getBedroomData($metadata, $num_beds, $type);

print_r($final);