将多个1D阵列转换为2D阵列的列的最有效方法

时间:2010-04-05 20:48:07

标签: php arrays optimization

当我今天早些时候写一个for循环时,我认为必须有一个更简洁的方法来做这个...所以我想我会问。我简要地看了一个重复的问题,但没有看到任何明显的问题。

问题:

给定长度为M的N个数组,将它们转换为N列2D数组的M行

实施例

$id   = [1,5,2,8,6]
$name = [a,b,c,d,e]
$result = [[1,a],
           [5,b],
           [2,c],
           [8,d],
           [6,e]]

我的解决方案:

非常直接,可能不是最佳,但确实有效:

<?php
// $row is returned from a DB query
// $row['<var>'] is a comma separated string of values
$categories = array();
$ids = explode(",", $row['ids']);
$names = explode(",", $row['names']);
$titles = explode(",", $row['titles']);
for($i = 0; $i < count($ids); $i++) {
    $categories[] = array("id" => $ids[$i],
                          "name" => $names[$i],
                          "title" => $titles[$i]);
}
?>

注意:我没有把名字=&gt;规范中的值位,但如果有某种方法可以保留它,那就太棒了。

2 个答案:

答案 0 :(得分:3)

也许这个?不确定它是否更有效但它绝对更清洁。

/*
Using the below data:

$row['ids'] = '1,2,3';
$row['names'] = 'a,b,c';
$row['titles'] = 'title1,title2,title3';
*/

$categories = array_map(NULL,
  explode(',', $row['ids']),
  explode(',', $row['names']),
  explode(',', $row['titles'])
);

// If you must retain keys then use instead:
$withKeys = array();

foreach ($row as $k => $v) {
    $v = explode(',', $v);

    foreach ($v as $k2 => $v2) {
        $withKeys[$k2][$k] = $v[$k2];
    }
}

print_r($categories);
print_r($withKeys);

/*
$categories:

array
  0 => 
    array
      0 => int 1
      1 => string 'a' (length=1)
      2 => string 'title1' (length=6)
...

$withKeys:

array
  0 =>
    array
      'ids' => int 1
      'names' => string 'a' (length=1)
      'titles' => string 'title1' (length=6)
...
*/

在本页面上为4个结果做了一个快速简单的基准测试,得到了以下结果:

// Using the following data set:
$row = array(
    'ids'       =>  '1,2,3,4,5',
    'names'     =>  'abc,def,ghi,jkl,mno',
    'titles'    =>  'pqrs,tuvw,xyzA,BCDE,FGHI'
);

/*
For 10,000 iterations,

Merge, for:
0.52803611755371

Merge, func:
0.94854116439819

Merge, array_map:
0.30260396003723

Merge, foreach:
0.40261697769165
*/

答案 1 :(得分:1)

是的,array_combine()

$result = array_combine( $id, $name );

修改

以下是我处理数据转换的方法

function convertRow( $row )
{
  $length = null;
  $keys = array();

  foreach ( $row as $key => $value )
  {
    $row[$key] = explode( ',', $value );
    if ( !is_null( $length ) && $length != count( $row[$key] ) )
    {
      throw new Exception( 'Lengths don not match' );
    }
    $length = count( $row[$key] );

    // Cheap way to produce a singular - might break on some words
    $keys[$key] = preg_replace( "/s$/", '', $key );
  }

  $output = array();

  for ( $i = 0; $i < $length; $i++ )
  {
    foreach ( $keys as $key => $singular )
    {
      $output[$i][$singular] = $row[$key][$i];
    }
  }

  return $output;
}

并进行测试

$row = convertRow( $row );
echo '<pre>';
print_r( $row );