如何转置多维多文件上传提交并保持关联键?

问题描述 投票:3回答:4

我有以下表单,当发送多张图片时,会生成一个多维数组,所有数据都是默认排序的。

表格是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
    )
);
php arrays multidimensional-array file-upload transpose
4个回答
2
投票

这个简单的 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
        )

)

1
投票

这是默认的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'];
    }
}

?>

1
投票

这个任务是关于 "转置 "一个数组和维护关联键。

三年后,我决定大修重写这个答案,因为当时的编码标准比我现在能容忍的低得多,而且普遍噪音太大。 在我自己的一个项目中,我只有两种方法来执行这个任务。 两种方式都能提供相同的(想要的)结果,只是编码风格的不同而已。

演示

$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);

0
投票

我非常感谢所有在这个帖子中贡献自己知识的用户,给了我很大的帮助,用想法和不同的方式来组织和分组更好的多维安排,还有很多方法可以做到这一点,每一种方法都比其他方法有更多的优势,但他们实现的目标。

我将再做一个贡献,用一种方法来做,感谢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
        )

)
© www.soinside.com 2019 - 2024. All rights reserved.