Не может закодировать 0-й элемент массива в php - PullRequest
0 голосов
/ 28 октября 2018

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

php script

$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-й всегда заканчивается таким ответом. Любая помощь будет оценена

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

1 Ответ

0 голосов
/ 28 октября 2018
Массив

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 ...

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