Недопустимое смещение строки со строками float и int - PullRequest
0 голосов
/ 04 января 2019

Мне нужно показать на странице некоторые данные из json_decode, но я получаю ошибку недопустимого смещения.

$json = '{"result":{"keyword":"seo",
                    "cost":0.54,
                    "concurrency":25,
                    "found_results":422000000,
                    "region_queries_count":1900,
                    "region_queries_count_wide":0,
                    "region_queries_count_phrase":0,
                    "types":["related_search","pic"],
                    "geo_names":[],
                    "social_domains":["wikipedia","linkedin"],
                    "right_spelling":null,
                    "keyword_length":1,
                    "lang":null,
                    "keyword_id":"647713",
                    "suggestions_count":12528,
                    "keywords_count":1637
                    },
          "status_msg":"OK",
          "status_code":200,
          "left_lines":99787
         }';
$obj = json_decode($json, true);
if (is_array($obj['result'])) {
foreach ($obj['result'] as $keywords) {

echo '<li>Keyword: "'.$keywords['keyword'].'", Adwords CPC: <b>'.$keywords['cost'].'</b> USD, Concurrency: <b>'.$keywords['concurrency'].'</b>, Results: <b>'.$keywords['found_results'].'</b>, Search Volume: <b>'.$keywords['region_queries_count'].'</b>.</li>'.PHP_EOL;
echo '</ol>';
 }
}    

var_dump($obj) return:
array(4) { ["result"]=> array(16) { ["keyword"]=> string(3) "seo" ["cost"]=> float(0.54) ["concurrency"]=> int(25) ["found_results"]=> int(422000000) ["region_queries_count"]=> int(1900) ["region_queries_count_wide"]=> int(0) ["region_queries_count_phrase"]=> int(0) ["types"]=> array(2) { [0]=> string(14) "related_search" [1]=> string(3) "pic" } ["geo_names"]=> array(0) { } ["social_domains"]=> array(2) { [0]=> string(9) "wikipedia" [1]=> string(8) "linkedin" } ["right_spelling"]=> NULL ["keyword_length"]=> int(1) ["lang"]=> NULL ["keyword_id"]=> string(6) "647713" ["suggestions_count"]=> int(12528) ["keywords_count"]=> int(1637) } ["status_msg"]=> string(2) "OK" ["status_code"]=> int(200) ["left_lines"]=> int(99791) }

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Если есть возможность иметь несколько ключевых слов, то это может быть представлено как массив объектов. Принимая во внимание, что одиночное ключевое слово представлено отдельным объектом JSON. Чтобы справиться с обоими из них, этот код проверит, является ли он массивом объектов, если нет, то он преобразует одну запись в массив, чтобы обе опции могли быть обработаны с использованием одного и того же кода ...

$obj = json_decode($json, true);
if (isset($obj['result'])) {
    // If not a numerically indexed array - convert it
    if ( !isset($obj['result'][0]))  {
        $obj['result'] = [$obj['result']];
    }
    foreach ($obj['result'] as $keywords) {
        echo '<li>Keyword: "'.$keywords['keyword'].'", Adwords CPC: <b>'.$keywords['cost'].'</b> USD, Concurrency: <b>'.$keywords['concurrency'].'</b>, Results: <b>'.$keywords['found_results'].'</b>, Search Volume: <b>'.$keywords['region_queries_count'].'</b>.</li>'.PHP_EOL;
        echo '</ol>';
    }
}
0 голосов
/ 04 января 2019

Вы перебираете массив $obj['results'], но это уже корневой элемент, который вы хотите использовать для своих ключевых слов. Просто используйте это вместо:

$keywords = $obj['result'];
echo '<li>Keyword: "'.$keywords['keyword'].'", Adwords CPC: <b>'.$keywords['cost'].'</b> USD, Concurrency: <b>'.$keywords['concurrency'].'</b>, Results: <b>'.$keywords['found_results'].'</b>, Search Volume: <b>'.$keywords['region_queries_count'].'</b>.</li>'.PHP_EOL;
echo '</ol>';

Выход:

<li>Keyword: "seo", Adwords CPC: <b>0.54</b> USD, Concurrency: <b>25</b>, Results: <b>422000000</b>, Search Volume: <b>1900</b>.</li> </ol>

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...