Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组使用php组合三个或更多数组_Php_Arrays - Fatal编程技术网

数组使用php组合三个或更多数组

数组使用php组合三个或更多数组,php,arrays,Php,Arrays,好的,假设我有5个数组,都是索引数组,我想把它们组合起来,这是我能想到的最好的方法,有没有更好的方法来处理这个问题 function mymap_arrays(){ $args=func_get_args(); $key=array_shift($args); return array_combine($key,$args); } $keys=array('u1','u2','u3'); $names=array('Bob','Fred','Joe'); $emails=

好的,假设我有5个数组,都是索引数组,我想把它们组合起来,这是我能想到的最好的方法,有没有更好的方法来处理这个问题

function mymap_arrays(){
    $args=func_get_args();
    $key=array_shift($args);
    return array_combine($key,$args);
}
$keys=array('u1','u2','u3');
$names=array('Bob','Fred','Joe');
$emails=array('bob@mail.com','fred@mail.com','joe@mail.com');
$ids=array(1,2,3);
$u_keys=array_fill(0,count($names),array('name','email','id'));
$users=array_combine($keys,array_map('mymap_arrays',$u_keys,$names,$emails,$ids));
这将返回:

Array
(
    [u1] => Array
        (
            [name] => Bob
            [email] => bob@mail.com
            [id] => 1
        )

    [u2] => Array
        (
            [name] => Fred
            [email] => fred@mail.com
            [id] => 2
        )

    [u3] => Array
        (
            [name] => Joe
            [email] => joe@mail.com
            [id] => 3
        )

)
编辑:经过大量的基准测试后,我使用了玻璃机器人的一个版本来处理不同数量的阵列,这显然比他的慢,但比我最初的版本快:

function test_my_new(){
    $args=func_get_args();
    $keys=array_shift($args);
    $vkeys=array_shift($args);
    $results=array();
    foreach($args as $key=>$array){
        $vkey=array_shift($vkeys);
        foreach($array as $akey=>$val){
            $result[$keys[$akey]][$vkey]=$val;
        }
    }
    return $result;
}
$keys=array('u1','u2','u3');
$names=array('Bob','Fred','Joe');
$emails=array('bob@mail.com','fred@mail.com','joe@mail.com');
$ids=array(1,2,3);
$vkeys=array('name','email','id');
test_my_new($keys,$vkeys,$names,$emails,$ids);

就个人而言,为了可读性,我会这样做:

$keys   = array('u1','u2','u3');
$names  = array('Bob','Fred','Joe');
$emails = array('bob@mail.com','fred@mail.com','joe@mail.com');
$ids    = array(1,2,3);
$result = array();

foreach ($keys as $id => $key) {
    $result[$key] = array(
        'name'  => $names[$id],
        'email' => $emails[$id],
        'id'    => $ids[$id],
    );
}

这里基本上是一个一行的元素集合:

$combined = array_combine($keys, array_map(function ($id, $name, $email) {
                return compact('id', 'name', 'email');
            }, $ids, $names, $emails));
这里是PHP 5.2的一个版本-没有匿名函数:

$combined = array_combine($keys, array_map(create_function('$id, $name, $email',
                'return compact("id", "name", "email");'
            ), $ids, $names, $emails));
对于数量可变的元素,它将如下所示:

function combineValues($keys, $values) {
    $vKeys = array_keys($values);
    return array_combine($keys, array_map(
               function ($values) use ($vKeys) { return array_combine($vKeys, $values); },
               call_user_func_array('array_map', array_merge(
                   array(function () { return func_get_args(); }),
                   $values))));
}

$combined = combineValues($keys, array('name' => $names, 'email' => $emails, 'id' => $ids));
function combineValues($keys, $values) {
    $result = call_user_func_array('array_map', array_merge(
                  array(create_function('', 'return func_get_args();')),
                  $values));

    array_walk($result,
               create_function('&$val, $i, $keys', '$val = array_combine($keys, $val);'),
               array_keys($values));

    return array_combine($keys, $result);
}
我必须承认这看起来很神秘,所以这里有一个扩展版本:

function combineValues($keys, $values) {
    $valueKeys = array_keys($values);
    $combinedValues = call_user_func_array('array_map', array_merge(array(function () { return func_get_args(); }), $values));
    $combinedValues = array_map(function ($values) use ($valueKeys) { return array_combine($valueKeys, $values); }, $combinedValues);
    return array_combine($keys, $combinedValues);
}
对于PHP5.2-可能如下所示:

function combineValues($keys, $values) {
    $vKeys = array_keys($values);
    return array_combine($keys, array_map(
               function ($values) use ($vKeys) { return array_combine($vKeys, $values); },
               call_user_func_array('array_map', array_merge(
                   array(function () { return func_get_args(); }),
                   $values))));
}

$combined = combineValues($keys, array('name' => $names, 'email' => $emails, 'id' => $ids));
function combineValues($keys, $values) {
    $result = call_user_func_array('array_map', array_merge(
                  array(create_function('', 'return func_get_args();')),
                  $values));

    array_walk($result,
               create_function('&$val, $i, $keys', '$val = array_combine($keys, $val);'),
               array_keys($values));

    return array_combine($keys, $result);
}

我没有检查效率,但在我的解决方案中,我只使用标准函数(它们应该优化),没有自定义映射和循环:

// assigning the data from your question
$keys = array('u1','u2','u3');
$names = array('Bob','Fred','Joe');
$emails = array('bob@mail.com','fred@mail.com','joe@mail.com');
$ids = array(1,2,3);

// creating resulting array
$result = array_merge_recursive(
    array_combine($keys, $names),
    array_combine($keys, $emails),
    array_combine($keys, $ids)
);

您尝试过此解决方案吗?

对于多个阵列组合,只需尝试此解决方案(如果您有阵列长度)

$array_id=array('1','2','3');
$array1=数组('arr1_值1','arr1_值2','arr1_值3');
$array2=数组('arr2_值1','arr2_值2','arr2_值3');
$array3=数组('arr3_值1','arr3_值2','arr3_值3');
$lenght=计数($array\u id);
$i=0;
而($i<$lenght){
$result[]=数组(
$array_id[$i]
,$array1[$i]
,$array2[$i]
,$array3[$i]
);
$i++;
}
回声';
打印(结果);

它可以工作;)还有什么更好的呢?我总是惊讶于我对php的了解如此之少;)当我对一个特定的函数进行大量处理时,我总是担心我“走了很长的路”。。。我知道这不会太长,但它将在我正在开发的系统中大量使用:)更可读、更快:)现在我只需要将其设置为接受可变数量的数组,还有一个数组,它定义了每个数组的值键以及结果数组:)+1,这是我第一次设法解析我即将发布的问题,并提出了一个实际对我有用的问题和答案。:-)删除最后一项“id”的逗号回显“$ids[$id]$names[$id]$emails[$id]
”;回答得好!