【问题标题】:array combine three or more arrays with php数组将三个或更多数组与php结合起来
【发布时间】:2011-07-01 22:20:15
【问题描述】:

好的,假设我有 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
        )

)

编辑:经过大量基准测试后,我选择了 Glass Robots 版本的答案来处理可变数量的数组,它显然比他的要慢,但比我原来的要快:

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

【问题讨论】:

  • 它有效 ;) 什么应该更好?
  • 我总是对我对 php 的了解如此之少感到惊讶;) 当我使用特定函数进行大量处理时,我总是担心我会“走很长的路”。 .. 我知道这并不长,但它会在我正在开发的系统中大量使用:)

标签: php arrays


【解决方案1】:

为了便于阅读,我个人会这样做:

$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],
    );
}

【讨论】:

  • 更具可读性和更快:) 现在我只需将其设置为接受可变数量的数组,以及一个为每个数组定义该值键的数组与结果数组:)
  • +1 是有史以来第一次 SO 成功解析了我即将发布的问题,并提出了一个真正对我有用的问题和答案。 :-)
  • 删除最后一项'id'的逗号
  • echo "$ids[$id] $names[$id] $emails[$id]
    ";很好的答案!
【解决方案2】:

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

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

您尝试过这个解决方案吗?

【讨论】:

    【解决方案3】:

    这里基本上是一组元素的单行:

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

    对于 PHP 5.2- 这可能如下所示:

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

    【讨论】:

      【解决方案4】:

      简单地尝试这个用于多重数组组合(如果你有数组长度)

      $array_id = array ('1', '2', '3');
      $array1 = array ('arr1_value1', 'arr1_value2', 'arr1_value3');
      $array2 = array ('arr2_value1', 'arr2_value2', 'arr2_value3');
      $array3 = array ('arr3_value1', 'arr3_value2', 'arr3_value3');
      
        $lenght = count($array_id);
        $i = 0;
      
        while ($i < $lenght) {
          $result[] = array(
              $array_id[$i]
              , $array1[$i]
              , $array2[$i]
              , $array3[$i]
          );
          $i++;
        }
      
      echo '<pre>';
      print_r($result);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多