preg match с json-страницы - PullRequest
       23

preg match с json-страницы

0 голосов
/ 26 сентября 2018

У меня есть одна страница в формате JSON, и я хочу удалить некоторые данные с этой страницы.Мне нужно удалить это "значение": "6fc975cd-bbd4-2daa-fc6b-1e8623f80caf | Антенны и фильтрующие изделия | Фильтрующие изделия"
это мой jsonpage

Это моя функция для preg match

    public function getcategories( $page = '' ) {
    $results = array();
    preg_match_all( '~/\[value\]\s=>\s(.*?)\s*\[~', $page, $matchall );
    debug($matchall);die;
    if ( !empty( $matchall[1] ) ) {
        foreach ( $matchall[1] as $single ) {
            if ( strlen( $single ) > 1 ) {
                $results[] = $single;
                }
            }
        }
    return $results;
}

И я вызываю эту функцию здесь

function checkpage( $page = '' ) {

    $vars_all_array = $this->getvarsallfrompage( $page );   
    $get_api_url = $this->catspostreq($page);
    $post_data   = $this->makePostData( $vars_all_array, 0, 25 );

    $jsonpage = $this->get_page( $get_api_url, array ('data' => $post_data, 'content-type'=> 'application/x-www-form-urlencoded; charset="UTF-8"; application/json' ) );
    $json_decoded = json_decode($jsonpage);
        $categories  = $this->getcategories( $json_decoded );
        debug($categories);die;
        }

Но что-то не работает хорошо, у меня есть этоошибка:

preg_match_all () ожидает, что параметр 2 будет строкой, задан массив

Может кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вам не нужно делать preg_match_all, чтобы получить значение из $json_decoded, так как json_decode() вернет (в случае успеха) идеально читаемый массив или объект.
Таким образом, чтобы получить одно конкретное значение, которое выможно получить к нему доступ следующим образом:

$value = $json_decoded['groupByResults'][0]->values[0]->value;

Поскольку вы хотите иметь все значения в новом массиве, вы можете просто перебрать значения и передать их в новый массив:

$categories = [];
foreach($json_decoded['groupByResults'][0]->values as $item) {
     $categories[] = $item['value'];
}

Есть встроенные функции массива, которые делают это в одну строку и, возможно, быстрее.Это должно проиллюстрировать, что вы делаете с данными.

Использование такой функции array_column () приведет к получению одной строки:

$categories =  array_column($json_decoded['groupByResults'][0]->values, "value");
0 голосов
/ 26 сентября 2018

В вашей функции checkpage вы передаете значение json_decode в функцию getcategories в качестве параметра, который в большинстве случаев возвращает массив.и в getcategories вы передаете параметр $page в качестве второго параметра preg_match_all

$json_decoded = json_decode($jsonpage);
$categories  = $this->getcategories( $json_decoded );

, а в ваших getcategories

preg_match_all('~/\[value\]\s=>\s(.*?)\s*\[~', $page, $matchall);

здесь $ page является результатом json_decode, который является массивом.вот почему вы получаете эту ошибку

...