首页 > 解决方案 > 在 PHP 中过滤 Json 项目

问题描述

我想使用 Ajax 调用传递的术语过滤以下 JSON

{"comuni":[{"datapresub":"08/08/2018","datasub":"01/02/2018","nomeComune":"ROMA","provincia":"RM"},{"nomeComune":"ROMAGNANO AL MONTE","provincia":"SA"},{"nomeComune":"ROMAGNANO SESIA","provincia":"NO"},{"nomeComune":"ROMAGNESE","provincia":"PV"},{"nomeComune":"ROMANA","provincia":"SS"},{"nomeComune":"ROMANENGO","provincia":"CR"},{"nomeComune":"ROMANO CANAVESE","provincia":"TO"},{"nomeComune":"ROMANO D'EZZELINO","provincia":"VI"},{"nomeComune":"ROMANO DI LOMBARDIA","provincia":"BG"},{"nomeComune":"ROMANS D'ISONZO","provincia":"GO"},{"nomeComune":"ROMBIOLO","provincia":"VV"},{"nomeComune":"ROMENO","provincia":"TN"},{"nomeComune":"ROMENTINO","provincia":"NO"},{"nomeComune":"ROMETTA","provincia":"ME"}]}

如果使用的术语是 ROMA,结果应该是

[{"datapresub":"08/08/2018","datasub":"01/02/2018","nomeComune":"ROMA","provincia":"RM"}]

我正在使用以下代码,但我无法创建一个函数来过滤来自 JSON 的数据:

function pippo_action() {
    if(!empty($_GET['term'])) {
        $term = $_GET['term'];
        $request = wp_remote_get( "https://demo.ec2webdesign.com/anpr-dev/comuni.json", array(
            'headers'   => array('Content-Type' => 'application/json;')
        ));
        if( is_wp_error( $request ) ) {
            return false;
        }
        $body = wp_remote_retrieve_body( $request );
        $data = json_decode( $body );

        wp_die();
    }
}

任何帮助表示赞赏。

谢谢

上面的代码工作正常,但预期的结果只适用于第一项。如果我从列表中选择第二项,我得到以下结果:

{"1":{"datapresub":"08\/08\/2018","datasub":"","nomeComune":"ROMAGNANO AL MONTE","provincia":"SA"}}

反而:

[{"datapresub":"08\/08\/2018","datasub":"","nomeComune":"ROMAGNANO AL MONTE","provincia":"SA"}]

有没有机会让它修改php代码?

谢谢

标签: phpjson

解决方案


给定这个字符串:

$jsonString = <<<'TAG'
{
    "comuni": [
    {
        "datapresub": "08/08/2018",
        "datasub": "01/02/2018",
        "nomeComune": "ROMA",
        "provincia": "RM"
    },
    {
        "nomeComune": "ROMAGNANO AL MONTE",
        "provincia": "SA"
    }
    ]
}
TAG;

以下代码应该可以工作。我已经包含了断言,但您可能应该有更好的验证逻辑。内联注释应该解释逻辑。

// Decode to an object
$jsonData = json_decode($jsonString, false, 512, JSON_THROW_ON_ERROR);

// Quick sanity test
assert(property_exists($jsonData, 'comuni'));
assert(is_array($jsonData->comuni));

// The term we are searching for
$term = 'ROMA';

// Filter our array
$jsonFiltered = array_filter(
    $jsonData->comuni,
    static function ($item) use ($term) {
        assert(property_exists($item, 'nomeComune'));
        return $term === $item->nomeComune;
    }
);

// Back to JSON
$jsonResult = json_encode($jsonFiltered);

的值为$jsonResult

[
    {
        "datapresub": "08\/08\/2018",
        "datasub": "01\/02\/2018",
        "nomeComune": "ROMA",
        "provincia": "RM"
    }
]

推荐阅读