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和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
    )
);
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行代码就是您所需要的全部。