我正在尝试合并到数组。至少我所知道的是两个阵列。但是PHP返回错误,说第一个不是数组。
我的最终目标是上传图像,然后在我的文本文件中获取现有数据,将新结果附加到现有数据的末尾,然后将其全部写回数据库。这样,每次上传新图像时都不会覆盖文件,因此您可以继续上传越来越多的图像。
这是我的php:
<?php
$sFileName = "imgDB.txt";
$temp = "temp.txt";
for($i=0 ; $i < count($_FILES) ; $i++){
move_uploaded_file( $_FILES['file-'.$i]['tmp_name'] , "img/". $_FILES['file-
'.$i]['name'] );
}
// Get the content of the file!
$sImgs = file_get_contents($sFileName); //gets a string from the file.
$ajImgs = json_decode($sImgs); //converts the string to an array.
$aOutPut = array_merge ($ajImgs, $_FILES);
$aSendToFile = json_encode($aOutPut, JSON_PRETTY_PRINT |
JSON_UNESCAPED_UNICODE);
file_put_contents($sFileName, $aSendToFile);
答案 0 :(得分:1)
问题可能在这里:
$ajImgs = json_decode($sImgs);
默认情况下,json_decode()
返回一个对象。如果你想要一个数组,你可以传递布尔true
作为可选的第二个参数:
$ajImgs = json_decode($sImgs,1);
来自docs:
<强> ASSOC 强>
当为TRUE时,返回的对象将被转换为关联数组。
但是,如果文件“imgDB.txt”为空,您可能还会从false
返回布尔值json_decode()
,因此您可以检查确保您有一个这样的数组:< / p>
$ajImgs = json_decode($sImgs,1) ?: array();
这是:
的简写if (json_decode($sImgs,1) != false) {
$ajImgs = json_decode($sImgs,1);
} else {
$ajImgs = array();
}
<强>更新强>
要解决json中覆盖的图像,同时仍然避免欺骗我建议使用文件名作为密钥构建一个新数组:
// initialize a new array for use below
$files = array();
for($i=0 ; $i < count($_FILES) ; $i++){
/* for some reason your application posts some empty files
without going to deep into the javascript side,
here is a simple way to ignore those */
if (empty($_FILES['file-'.$i]['size'])) continue;
move_uploaded_file( $_FILES['file-'.$i]['tmp_name'] , "img/". $_FILES['file-'.$i]['name'] );
// now we build a new array using filenames as array keys
$files[$_FILES['file-'.$i]['name']] = $_FILES['file-'.$i];
// if you don't care about dupes you can use a numeric key like this
// $files[] = $_FILES['file-'.$i];
}
// now do your merge with this new array
$aOutPut = array_merge ($ajImgs, $files);
以上内容已经过测试,对我有用。可能有更好的方法来解决这个问题,例如将文件直接添加到解码的json ,但重写整个应用程序超出了这个问题的范围。
答案 1 :(得分:0)
您需要为json_decode()添加第二个参数。
$ajImgs = json_decode($sImgs, true);