Php附加到2d JSON数组并正确添加到文件

时间:2016-03-12 12:13:42

标签: php arrays json multidimensional-array

我慢慢开始学习处理json文件,并遇到了两个小问题。

我有一个看起来像这样的json文件:

{ "foldery" : [
    {
      "foName": "website/img/post1",
      "files" : [
        "website/img/post1/a.jpeg",
        "website/img/post1/b.jpg",
        "website/img/post1/c.jpeg",
        "website/img/post1/d.jpg",
        "website/img/post1/e.jpeg",
        "website/img/post1/f.jpg",
        "website/img/post1/g.jpg",
        "website/img/post1/h.jpg"
      ]
    },
    {
      "foName": "website/img/postdrugi",
      "files" : [
        "website/img/postdrugi/20150530_111106.jpg",
        "website/img/postdrugi/20150530_113842.jpg",
        "website/img/postdrugi/20150530_131251.jpg",
        "website/img/postdrugi/20151022_165146.jpg"
      ]
    },
    {
      "foName": "website/img/eeeeeeeeeeee",
      "files" : [
        "website/img/postrzy/20151101_130349.jpg",
        "website/img/postrzy/20151101_132214.jpg",
        "website/img/postrzy/20151101_134512.jpg"
      ]
    }
  ]
}

您可以看到该文件包含文件夹和特定文件夹中每个图像的路径。 现在我正在使用文件添加脚本。该脚本首先创建一个目录,然后用文件填充它。我的目标是编写代码,用新值自动更新json。

为此,我写了一个从dir创建开始的数组:

  $desired_dir="website/img/".$name."/";
            $json = array(
              'foName' => $desired_dir,
              'files' => array()
            );

并且在每个文件创建时都盯着它推销它:

            (...)
            $json['files'][$i] = $filto;
            ++$i; //$i was beforehand started as equal 0
            echo "<p>". $file_name." Uploaded!".$filto." </p>";

不幸的是在 echo json_encode($ json,JSON_FORCE_OBJECT); 我明白了:

 {"foName":"website\/img\/aaaddd\/",
 "files":{"0":"website\/img\/aaaddd\/s\/bar.jpg"}}

而非期望:

 {"foName":"website/img/aaaddd/",
 "files":["website/img/aaaddd/s/bar.jpg",
         "website/img/aaaddd/s/foo2.jpg",
         "website/img/aaaddd/s/bar2.jpg"]}

(用于上传三个文件:bar,foo2和bar2) 请注意缺少的&#39;&#34; 0&#34;:&#39; 所以这是我的两个问题:

  1. 我该怎么做才能使json编码显示适合json中数组的值。使用正确的追加,删除嵌套数组中的索引号
  2. 如何正确地将这些文件添加到我的.json文件中? (注意{&#34;文件夹&#34;:文件开头的[(..))
  3. 另外,一个小奖励:我应该担心&#39; /&#39;而不是&#39; /&#39;?无意中听到JSON的含义都是一样的。

    任何帮助都会很棒。

    编辑:根据要求。以下是将文件上载到给定目录的整个脚本:

    <?php
        if(isset($_FILES['files']) && isset($_POST['name'])){
          $json = array();
    
          $name = $_POST['name'];
    
            foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
                $file_name = $key.$_FILES['files']['name'][$key];
                $file_size =$_FILES['files']['size'][$key];
                $file_tmp =$_FILES['files']['tmp_name'][$key];
                $file_type=$_FILES['files']['type'][$key];
                if($file_size > 12582912){
                    $errors[]='File size must be less than 12 MB';
                }
                $desired_dir="website/img/".$name."/";
    
                $json = array(
                  'foName' => $desired_dir,
                  'files' => array()
                );
                if(empty($errors)==true){
                    if(is_dir($desired_dir)==false){
                        mkdir("$desired_dir", 0700);        // Create directory if it does not exist
                    }
    
                    if(is_dir($desired_dir."/s")==false){
                        mkdir("$desired_dir/s", 0700);      // Create directory if it does not exist
                    }
                    if(is_dir("$desired_dir/".$file_name)==false){
                        move_uploaded_file($file_tmp, $desired_dir.$file_name);
                        $filto= $desired_dir."s/".$file_name;
                        $filfrom= $desired_dir.$file_name;
                        smart_resize_image($filfrom , null, 400 , 400 , true , $filto , false , false ,100 );
                        $json['files'][] = $filto;
                      //  echo "<p>". $file_name." Uploaded!".$filto." </p>";
    
    
                    }else{                                  //rename the file if another one exist
                        $new_dir="website/img/".$file_name.time();
                         rename($file_tmp,$new_dir);
                         echo "<p>". $file_name." Uploaded! </p>";
    
                    }
    
    
    
                }else{
                        print_r($errors);
                }
            }
            if(empty($error)){
            echo json_encode($json);
                echo "<h2>Success</h2>";
            }
        }
        ?>
    

2 个答案:

答案 0 :(得分:1)

当您使用JSON_FORCE_OBJECT时,您告诉json_encode()始终将数据作为对象而不是数组返回,因此您会看到0索引附加到files

来自php.net,

  

JSON_FORCE_OBJECT(整数):       使用非关联数组时,输出对象而不是数组。当输出的接收者是。时特别有用   期待一个对象,数组是空的。自PHP 5.3.0起可用。

删除标志,您将看到没有0索引的所需数据,为什么您只看到阵列中的一个数据可能与您如何将目录路径推送到主阵列有关在你的循环中。

小提琴:https://eval.in/535407

修改 你每次在循环中重新实例化$ json变量,把它放在循环之外,

 $json = array(
  'foName' => '',
  'files' => array()
 );
 ...
 foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
  ....
  $desired_dir="website/img/".$name."/";
  $json['foName'] = $desired_dir;
  ....
  ..

答案 1 :(得分:1)

将它移出你的循环,所以它在它之前:

       $json = array(
          'foName' => $desired_dir,
          'files' => array()
        );

要得到这个:

    $json = array(
      'foName' => $desired_dir,
      'files' => array()
    );
  foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
        $file_name = $key.$_FILES['files']['name'][$key];
        $file_size =$_FILES['files']['size'][$key];
        $file_tmp =$_FILES['files']['tmp_name'][$key];
        $file_type=$_FILES['files']['type'][$key];
        if($file_size > 12582912){
            $errors[]='File size must be less than 12 MB';
        }
        $desired_dir="website/img/".$name."/";
        $json['foName'] = $desired_dir;
        /// etc...

因为现在每次迭代都会破坏放在files arrray中的先前结果。

如上所述,您还需要从调用JSON_FORCE_OBJECT中删除json_encode参数,它是否会将数组转换为对象,从而产生0等属性。