Php 如何转换多维多文件上传提交并维护关联键?
我有下面的格式,当发送多个图像时,会生成一个多维数组,默认情况下所有数据都按顺序排列 表单HTML和PHP:Php 如何转换多维多文件上传提交并维护关联键?,php,arrays,multidimensional-array,file-upload,transpose,Php,Arrays,Multidimensional Array,File Upload,Transpose,我有下面的格式,当发送多个图像时,会生成一个多维数组,默认情况下所有数据都按顺序排列 表单HTML和PHP: <html> <body> <form enctype="multipart/form-data" action="" method="POST"> <input name="image[]" type="file" multiple /> <input type
<html>
<body>
<form enctype="multipart/form-data" action="" method="POST">
<input name="image[]" type="file" multiple />
<input type="submit" name="send" value="Send" />
</form>
</body>
</html>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$file2 = array(
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
),
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
)
);
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
<?php
$files = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
function normalize_files_array($files = []) {
$normalized_array = [];
foreach($files as $index => $file) {
if (!is_array($file['name'])) {
$normalized_array[$index][] = $file;
continue;
}
foreach($file['name'] as $idx => $name) {
$normalized_array[$index][$idx] = [
'name' => $name,
'type' => $file['type'][$idx],
'tmp_name' => $file['tmp_name'][$idx],
'error' => $file['error'][$idx],
'size' => $file['size'][$idx]
];
}
}
return $normalized_array;
}
echo "<pre>"; print_r(normalize_files_array($files));
?>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$array = array_map(null, $file1['imagen']['name'], $file1['imagen']['type'], $file1['imagen']['tmp_name'], $file1['imagen']['error'], $file1['imagen']['size']);
echo "<pre>"; print_r($array);
Array
(
[0] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
[1] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
)
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
我需要以一种更简单的方式重新构造这个数组,以便将各个图像值放在一起
预期输出:
<html>
<body>
<form enctype="multipart/form-data" action="" method="POST">
<input name="image[]" type="file" multiple />
<input type="submit" name="send" value="Send" />
</form>
</body>
</html>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$file2 = array(
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
),
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
)
);
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
<?php
$files = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
function normalize_files_array($files = []) {
$normalized_array = [];
foreach($files as $index => $file) {
if (!is_array($file['name'])) {
$normalized_array[$index][] = $file;
continue;
}
foreach($file['name'] as $idx => $name) {
$normalized_array[$index][$idx] = [
'name' => $name,
'type' => $file['type'][$idx],
'tmp_name' => $file['tmp_name'][$idx],
'error' => $file['error'][$idx],
'size' => $file['size'][$idx]
];
}
}
return $normalized_array;
}
echo "<pre>"; print_r(normalize_files_array($files));
?>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$array = array_map(null, $file1['imagen']['name'], $file1['imagen']['type'], $file1['imagen']['tmp_name'], $file1['imagen']['error'], $file1['imagen']['size']);
echo "<pre>"; print_r($array);
Array
(
[0] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
[1] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
)
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
这是默认php功能的预期输出。但是,您可以编写自定义函数,以如下所示的形式对数组进行消毒:
<?php
function reArrayFiles(&$file_post) {
$file_ary = array();
$file_count = count($file_post['name']);
$file_keys = array_keys($file_post);
for ($i=0; $i<$file_count; $i++) {
foreach ($file_keys as $key) {
$file_ary[$i][$key] = $file_post[$key][$i];
}
}
return $file_ary;
}
?>
Then u can do the following:
<?php
if ($_FILES['upload']) {
$file_ary = reArrayFiles($_FILES['ufile']);
foreach ($file_ary as $file) {
print 'File Name: ' . $file['name'];
print 'File Type: ' . $file['type'];
print 'File Size: ' . $file['size'];
}
}
?>
然后,您可以执行以下操作:
这个简单的foreach
循环将帮助您解决问题
此任务是关于“转置”数组和维护关联键
三年后,我决定彻底修改/重写这个答案,因为编码标准比我现在所能容忍的要低得多,而且通常有太多的噪音。只有两种方法可以在我自己的一个项目上执行此任务。两者都提供相同的(期望的)结果;区分它们的仅仅是编码风格的问题
函数式编程:
$keys = array_keys($POST['image']);
var_export(
array_map(
function(...$col) use ($keys) {
return array_combine($keys, $col);
},
...array_values($POST['image'])
)
);
语言构造语法:
foreach ($POST['image'] as $key => $entries) {
foreach ($entries as $index => $entry) {
$result[$index][$key] = $entry;
}
}
var_export($result);
我非常感谢所有在这篇文章中贡献了知识的用户,他们给了我很多帮助。我将再做一次贡献,并提出一个方法。这是密码 方法#1:
<html>
<body>
<form enctype="multipart/form-data" action="" method="POST">
<input name="image[]" type="file" multiple />
<input type="submit" name="send" value="Send" />
</form>
</body>
</html>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$file2 = array(
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
),
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
)
);
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
<?php
$files = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
function normalize_files_array($files = []) {
$normalized_array = [];
foreach($files as $index => $file) {
if (!is_array($file['name'])) {
$normalized_array[$index][] = $file;
continue;
}
foreach($file['name'] as $idx => $name) {
$normalized_array[$index][$idx] = [
'name' => $name,
'type' => $file['type'][$idx],
'tmp_name' => $file['tmp_name'][$idx],
'error' => $file['error'][$idx],
'size' => $file['size'][$idx]
];
}
}
return $normalized_array;
}
echo "<pre>"; print_r(normalize_files_array($files));
?>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$array = array_map(null, $file1['imagen']['name'], $file1['imagen']['type'], $file1['imagen']['tmp_name'], $file1['imagen']['error'], $file1['imagen']['size']);
echo "<pre>"; print_r($array);
Array
(
[0] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
[1] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
)
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
方法#2:
<html>
<body>
<form enctype="multipart/form-data" action="" method="POST">
<input name="image[]" type="file" multiple />
<input type="submit" name="send" value="Send" />
</form>
</body>
</html>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$file2 = array(
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
),
array(
'name' => 'Image_name',
'type' => 'jpg',
'tmp_name' => 'jpg',
'error' => 0,
'size' => 200
)
);
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
<?php
$files = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
function normalize_files_array($files = []) {
$normalized_array = [];
foreach($files as $index => $file) {
if (!is_array($file['name'])) {
$normalized_array[$index][] = $file;
continue;
}
foreach($file['name'] as $idx => $name) {
$normalized_array[$index][$idx] = [
'name' => $name,
'type' => $file['type'][$idx],
'tmp_name' => $file['tmp_name'][$idx],
'error' => $file['error'][$idx],
'size' => $file['size'][$idx]
];
}
}
return $normalized_array;
}
echo "<pre>"; print_r(normalize_files_array($files));
?>
$file1 = array(
'imagen' => array(
'name' => array(
'Image_name',
'Image_name'
),
'type' => array(
'jpg',
'jpg'
),
'tmp_name' => array(
'jpg',
'jpg'
),
'error' => array(
0,
0
),
'size' => array(
'200',
'200'
)
)
);
$array = array_map(null, $file1['imagen']['name'], $file1['imagen']['type'], $file1['imagen']['tmp_name'], $file1['imagen']['error'], $file1['imagen']['size']);
echo "<pre>"; print_r($array);
Array
(
[0] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
[1] => Array
(
[0] => Image_name
[1] => jpg
[2] => jpg
[3] => 0
[4] => 200
)
)
Array
(
[0] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
[1] => Array
(
[name] => Image_name
[type] => jpg
[tmp_name] => jpg
[error] => 0
[size] => 200
)
)
方法#3
如何生成您手动设置的值[0]?在这部分代码中,$result[“imagen”][0][$key]=$value[0];,如果有很多图片,我们可以改进它并使其自动化吗?@Learningandsharing是的,让我也更新你的帖子。@Learningandsharing我已经更新了我的帖子,你可以查看一个更大的例子。几个月前我也做了同样的事情,我使用了double
foreach
,就像你在最后展示的那样。这是最简单、最干净的解决方案。这5行代码就是您所需要的全部。