PHP Используйте foreach для строки json, содержащей смайлы Unicode - PullRequest
0 голосов
/ 29 мая 2020

У меня есть база данных, и в ней хранятся гильдии разногласий, а гильдии разногласий могут иметь смайлики, такие как ? ? и •. У меня возникла проблема, когда я пытаюсь выполнить foreach для данных, в нем просто указано

PHP Предупреждение: недопустимый аргумент для foreach () в / path / to / my / php / file

Я просто хочу либо полностью удалить все смайлики / юникоды, либо просто иметь возможность нормально отображать их в операторе foreach без тонны работы.

Foreach im using

$stmt = $conn->prepare("SELECT guilds FROM users WHERE discord_id = :discord_id");
$stmt->bindParam(':discord_id', $userdata['discord_id']);
$guildData = $stmt->fecth(PDO::FETCH_ASSOC);
$guildData = json_decode($guildData, true);
var_dump($guildData);

foreach($guildData as $g) {
    echo $g;
}

Пример данных, которые находятся в столбце guilds:

[{"id": 1, "guildname": "Server Name ?"}, {"id": 2, "guildname": "Server Name"}]

Я хочу либо сохранить их и показать все смайлы, либо полностью удалить все смайлы и символы Unicode.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020
$guildData = $stmt->fecth(PDO::FETCH_ASSOC);

Если вы исправите опечатку fecth в fetch, эта строка вернет массив . В целях отладки, когда вы напишете

var_dump($guildData);

после этой строки, вы увидите что-то вроде этого:

array(1) {
  ["guilds"]=>
  string(32) "[{"id": 1, "guildname": "Ser...."
}

Однако функция json_decode() ожидает строка, а не массив.

Чтобы исправить это, вы просто обращаетесь к полю guilds из массива:

$guildData = $stmt->fetch(PDO::FETCH_ASSOC); // returns an array
$jsonData = $guildData['guilds'];            // get the 'guilds' field
$extracted = json_decode($jsonData, true);   // JSON -> array
var_dump($extracted);                        // just for debugging

Это исправит «Недопустимый аргумент, предоставленный для foreach ()» сообщение об ошибке. Вам также, возможно, придется взглянуть на UTF-8 на всем протяжении , чтобы убедиться, что вы все настроили правильно, чтобы получить контент в правильном формате.

0 голосов
/ 29 мая 2020

Хорошо, я до сих пор не могу понять, что вы на самом деле пытаетесь выполнить sh, но есть ясно, так это то, что вы не знаете, как выглядят ваши данные, и вы шарите в темноте, пытаясь применить случайные функции и надеясь, что из echo.

получится что-то осмысленное, используйте var_dump(). Он расскажет вам, что именно, до мельчайших деталей. Например, var_dump($userdata['guilds']); точно скажет вам, что это за переменная на самом деле , и позволит вам принять информированное решение о том, что с ней делать дальше.

Например:

$input_json = '[{"id": 1, "guildname": "Server Name ?"}, {"id": 2, "guildname": "Server Name"}]';
$decoded = json_decode($input_json, true);

var_dump($input_json, $decoded);

Вывод:

string(83) "[{"id": 1, "guildname": "Server Name ?"}, {"id": 2, "guildname": "Server Name"}]"
array(2) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["guildname"]=>
    string(16) "Server Name ?"
  }
  [1]=>
  array(2) {
    ["id"]=>
    int(2)
    ["guildname"]=>
    string(11) "Server Name"
  }
}

Итак, теперь я знаю, что могу:

foreach( $decoded as $guild ) {
    echo "Guild: " . $guild['guildname'] . "\n";
}

Что меня дает:

Guild: Server Name ?
Guild: Server Name

, и если вы хотите по-настоящему улучшить свою отладочную игру, вам следует использовать что-то вроде XDebug и IDE, которая может правильно подключиться к нему.

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