Невозможно закодировать 0-й элемент массива в php

Я работаю над php-скриптом для загрузки нескольких файлов и получения данных json с сервера для загруженного файла. Однако ответ json не приходит таким, каким он должен быть

php скрипт

$con= new mysqli('localhost','root','','app');

$name='Dp User id ';
if (!empty($_FILES['files']['name'])&&!empty($_POST['id']))
    {
        $id=$_POST['id'];
        $files=$_FILES['files'];

        $response=array();
        $uploaded=array();
        $failed=array();

        $allowed=array('txt','jpeg','sig','pak','dll','jpg');

        foreach($files['name'] as $position=>$file_name)
        {

            $file_tmp=$files['tmp_name'][$position];
            $file_size=$files['size'][$position];
            $file_error=$files['error'][$position];

            $file_ext1=explode('.', $file_name);
            $file_ext=strtolower(end($file_ext1));

            if (in_array($file_ext,$allowed))
            {
                if ($file_error===0)
                {
                    if ($file_size<=2097152)
                    {
                        $file_name_new=$name.$id.'.'.$file_ext;
                        $upload_url =  $_SERVER['DOCUMENT_ROOT'].'/app2/User Files/User Id-'.$id.'/';
                        $file_destination=$upload_url.$file_name_new;
                        $Sql_Query = $con -> prepare("UPDATE profile SET pic= ? WHERE id = ?");
                        $Sql_Query -> bind_param("si", $file_destination,$id);
                        $sql = $Sql_Query -> execute();

                        if (move_uploaded_file($file_tmp,$file_destination))
                              {

                                //$uploaded[$position]=$file_destination.'<br>';
                                array_push($uploaded,array($position=>$file_destination.'<br>'));
                        }else{
                              $failed[$position] = "[{$file_name}] failed to upload".mysqli_error($con).'<br>';
                        }
                    }else{
                          $failed[$position] = "[$file_name] is too large.".mysqli_error($con).'<br>';
                    }
                }else{
                      $failed[$position] = "[$file_name] has error {$file_error}".mysqli_error($con).'<br>';
                }
            }else{
                  $failed[$position] = "[$file_name] has {$file_ext} which is not allowed".mysqli_error($con).'<br>';
            }
    }

        if (!empty($uploaded))
        {
             echo (json_encode(array(
               "success"=>1,
               "message" => $uploaded)));
        }

        if (!empty($failed))
        {
          echo json_encode(array(
            "success" => 0,
            "message" => $failed));
        }
    }

    mysqli_close($con);

    ?>

Я хочу, чтобы json был возвращен для этого скрипта следующим образом

{"success":1,
"message":[{"C:/Apache24/htdocs/app2/User Files/User Id-94/Dp User id 94.jpg
"},
{"1":"C:/Apache24/htdocs/app2/User Files/User Id-94/Dp User id 94.jpg
"},
{"2":"C:/Apache24/htdocs/app2/User Files/User Id-94/Dp User id 94.jpg
"}]}

но json идет вот так

 {"success":1,
"message":[["C:/Apache24/htdocs/app2/User Files/User Id-94/Dp User id 94.jpg
"],
{"1":"C:/Apache24/htdocs/app2/User Files/User Id-94/Dp User id 94.jpg
"},
{"2":"C:/Apache24/htdocs/app2/User Files/User Id-94/Dp User id 94.jpg
"}]}

0-й элемент находится между массивом, и я хочу, чтобы он находился между объектами, как и остальные. Всякий раз, когда я выбираю файлы и загружаю их, в ответ всегда отображается 0-й файл. Любая помощь будет принята с благодарностью.

заранее спасибо

Можете ли вы проверить, что $position на самом деле является 0 в первом цикле, вы можете попробовать print_r($_FILES['files']['name']);

Nigel Ren 28.10.2018 19:02

Проверьте тип переменной $position, которую вы установили в качестве ключа для массивов $uploaded и $failed. Когда все ключи представляют собой последовательность целых чисел с отсчетом от нуля, массив php кодируется как массив JSON, но если ваши ключи являются строками или смешанным набором чисел и строк, вы получите объект JSON.

Vytautas Lozickas 28.10.2018 19:02

но я хочу, чтобы переменная $ position была целочисленной @VytautasLozickas

Rahmat Ullah 28.10.2018 19:07

Вы имеете в виду, что хотите, чтобы у объектов JSON были ключи в виде целых чисел?

Vytautas Lozickas 28.10.2018 19:09

Я также пытался зациклить его с 1, но тогда отображаются только 2 файла вместо 3, если я загружаю 3 @NigelRen

Rahmat Ullah 28.10.2018 19:09

да, как 1-й и 2-й элемент массива сообщений @VytautasLozickas

Rahmat Ullah 28.10.2018 19:10

Но ключи 1-го и 2-го элементов не являются целыми числами, это строки в вашем выводе JSON. Попробуйте преобразовать переменную $ position при настройке массивов $uploaded и $failed, например, array_push($uploaded,array((string) $position=>$file_destination.'<br>')); и $failed[(string) $position]=..., и посмотрите, изменится ли ваш результат

Vytautas Lozickas 28.10.2018 19:14

О, я понял, я думаю, что мы не можем назначить целое число в качестве ключа в массиве json, я попытался поставить целое число со строкой, и теперь я получаю все 3 как объект благодаря @VytautasLozickas,

Rahmat Ullah 28.10.2018 19:14

Дело не в том, что JSON не поддерживает это, просто массив php с целочисленными ключами, начинающимися с 0, кодируется как массив JSON, но не объект JSON, и если у вас есть массив php со строковыми ключами или целочисленными ключами, не начинающимися с 0 (я думаю, что на самом деле ваш случай здесь) - вы получите объект из json_encode.

Vytautas Lozickas 28.10.2018 19:15

О, теперь я понял, спасибо @VytautasLozickas

Rahmat Ullah 28.10.2018 19:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
10
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

php с целочисленными ключами (включая неявно приведенные строки), начиная с 0, кодируется как массив JSON, но не как объект JSON. Между тем, массив php со строковыми ключами или целочисленными ключами не начиная с 0 (я думаю, что это ваш случай здесь) будет закодирован в объект JSON с помощью json_encode.

В вашем случае у вас есть два варианта:

  • Если вы хотите, чтобы ваш вывод содержал все объекты вместо массива для 1-го (0) элемент, просто увеличьте вашу переменную $position на 1 при нажатии элементов в ваши массивы $uploaded и $failed:

    array_push($uploaded,array($position+1=>$file_destination.'<br>'));
                                        ^^
    
    $failed[$position+1]=...
                     ^^
    

    Это, конечно, приведет к тому, что в вашем выводе JSON будет отображаться список с 1, а не с нуля.

  • В качестве альтернативы вы также можете передать JSON_FORCE_OBJECT в качестве второго параметра в json_encode, но это избавит вас от внешнего массива для message ...

Я также попытался зациклить его с 1, но тогда отображаются только 2 файла вместо 3, если я загружаю 3, это приближается Примечание: Неопределенное смещение: 3 в C: \ Apache24 \ htdocs \ app2 \ fileUpload.php on line 20 Примечание: Неопределенное смещение: 3 в C: \ Apache24 \ htdocs \ app2 \ fileUpload.php в строке 21 Примечание: Неопределенное смещение: 3 в C: \ Apache24 \ htdocs \ app2 \ fileUpload.php в строке 22 Примечание: Неопределенное смещение: 3 в C: \ Apache24 \ htdocs \ app2 \ fileUpload.php в строке 23 Например, {"успех": 1, "сообщение": [{"1": "грубый \ /1.jpg"}, {"2": "грубый \ /2.jpg"}]} Нет 0-го элемента

Rahmat Ullah 28.10.2018 19:20

Я имею в виду, что нет третьего элемента

Rahmat Ullah 28.10.2018 19:26

Спасибо за это !

Rahmat Ullah 28.10.2018 19:42

Другие вопросы по теме