Перебор значений JSON PHP

138
08 июля 2021, 10:00

Есть два запроса в формате JSON:

  1. {"results":[{"header":{"similarity":"93.49"},"data":{"material":"azur lane"}}]}

  2. {"results":[{"header":{"similarity":"93.49"},"data":{"material":"fate\/grand order, fate (series)"}}]}

Так же есть код:

$sau_query = explode(", ", $sau_res->data->material);
$text = "";
foreach($sau_query as $value){

    if($result = mysqli_query($link, "SELECT * FROM `tags_copyright` WHERE `first` LIKE '%{$value}%'")){
        if(mysqli_num_rows($result) == 0){
            $last = str_replace(' ', '_', ucwords(preg_replace('![^\w\d\s]*!', '', $value)));
            mysqli_query($link, "INSERT INTO `tags_copyright` VALUES (NULL, '$value', '#$last')");
        }elseif(mysqli_num_rows($result) != 0){
            while($res = mysqli_fetch_array($result)){
                if($res['last'] != ""){
                    $text .= $res['last']." ";
                    echo $res['last'] //(выдает #Azur_lane и #Fate_Series)
                }
            }
        }
    }
}
echo $text //(Выдает #Azur_lane Azur_lane #Fate_Series)

Не могу понять как так получается что на выходе дублируется #Azur_Lane

И как решить данную проблему? Заранее спасибо...

PS.

azur lanearray(6) {
    [0]=> string(1) "3" 
    ["id"]=> string(1) "3" 
    [1]=> string(9) "azur lane" 
    ["first"]=> string(9) "azur lane" 
    [2]=> string(10) "#Azur_Lane" 
    ["last"]=> string(10) "#Azur_Lane" 
} fate/grand order, 
fate (series)array(6) 
    { [0]=> string(2) "20" 
    ["id"]=> string(2) "20" 
    [1]=> string(16) "fate/grand order" 
    ["first"]=> string(16) "fate/grand order" 
    [2]=> string(0) "" 
    ["last"]=> string(0) "" 
} array(6) { 
    [0]=> string(1) "2" 
    ["id"]=> string(1) "2" 
    [1]=> string(13) "fate (series)" 
    ["first"]=> string(13) "fate (series)" 
    [2]=> string(12) "#Fate_Series" 
    ["last"]=> string(12) "#Fate_Series" 
}
Answer 1

В общем, вы используете mysqli_fetch_array(), по умолчанию, она возвращает вам массив в виде key => value, а также 0 => value, потому что вы не указали каким образом вы хотите видеть итоговый результат в переменной $res. Используйте второй параметр, чтобы указать что вы хотите использовать ассоциативный массив:

$res = mysqli_fetch_array($result, MYSQLI_ASSOC);

Подробнее обо всех параметрах и примерах можете прочесть в документации. Как раз таки там и написано, что по умолчанию вам приходит массив с разными ключами, но дублирующимися значениями.

READ ALSO
Insert into в sql

Insert into в sql

Имеется вот такой простенький код

97
Ошибка в роутинге

Ошибка в роутинге

Хотел сделать роутинг на чистом php, но потом меня черт дернул установить symfony/router и теперь я чувствую себя идиотоиУ меня проблема с подключением...

125
Мулти Файл аплоадер, ошибка

Мулти Файл аплоадер, ошибка

Имеется такой код

102
При использовании $_FILES ошибка с значениями

При использовании $_FILES ошибка с значениями

Не работает функция move_uploaded_file, скорее всего проблема в синтаксисе, можете подсказать, почему код так не работает?

110