我有以下表单,当发送多张图片时,会生成一个多维数组,所有数据都是默认排序的。
表格是HTML和PHP。
<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
)
);
这个简单的 foreach
循环将帮助你。
<?php
ini_set('display_errors', 1);
$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'
)
)
);
$result=array();
foreach ($file1["imagen"] as $key => $value)
{
foreach(range(0,count($value)-1) as $index)
{
$result[$index][$key]=$value[$index];
}
}
print_r($result);
输出:
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'];
}
}
?>
这个任务是关于 "转置 "一个数组和维护关联键。
三年后,我决定大修重写这个答案,因为当时的编码标准比我现在能容忍的低得多,而且普遍噪音太大。 在我自己的一个项目中,我只有两种方法来执行这个任务。 两种方式都能提供相同的(想要的)结果,只是编码风格的不同而已。
$POST = [
'image' => [
'name' => ['Image_name1', 'Image_name2'],
'type' => ['jpg', 'png'],
'tmp_name' =>['jpg', 'png'],
'error' => [0, 0],
'size' => ['200', '300']
]
];
函数式编程。
$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);
我非常感谢所有在这个帖子中贡献自己知识的用户,给了我很大的帮助,用想法和不同的方式来组织和分组更好的多维安排,还有很多方法可以做到这一点,每一种方法都比其他方法有更多的优势,但他们实现的目标。
我将再做一个贡献,用一种方法来做,感谢PHP社区,这里的代码。
方法#1:
<?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));
?>
结果#1:
Array (
[imagen] => 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。
$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);
结果#2。
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
)
)
方法3
<?php
$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'
)
)
);
function array_map_key($name, $type, $tmp_name, $error, $size){
$tmp_array['name'] = $name;
$tmp_array['type'] = $type;
$tmp_array['tmp_name'] = $tmp_name;
$tmp_array['error'] = $error;
$tmp_array['size'] = $size;
return $tmp_array;
}
$array = array_map('array_map_key', $file1['imagen']['name'], $file1['imagen']['type'], $file1['imagen']['tmp_name'], $file1['imagen']['error'], $file1['imagen']['size']);
echo "<pre>"; print_r($array);
?>
结果3:
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
)
)