在PHP中从1d数组创建2d矩阵的最有效方法

时间:2012-12-04 19:57:07

标签: php arrays multidimensional-array

给定一个字符串数组,例如$ a:

$a = array("zero", "one", "cat");

我正在寻找创建数组$ b,使用$ a中的值填充“沿对角线”:

$b[0] = ["zero", "-", "-"]
$b[1] = ["-", "one", "-"]
$b[3] = ["-", "-", "cat"]

到目前为止,我有:

function matrix($m, $n, $value) {
  return array_fill(0, $m, array_fill(0, $n, $value));
} // create a matrix (m,n) of $value

$a = array("zero", "one", "cat");  
$b = matrix(count($a),count($a),"'-'");  // create $b, filled with '-'

for($i = 0; $i < count($a); $i++){
  $b[$i][$i] = $a[$i];
} // fill matrix b with strings from a, along the diagonal

print_r($b);

在实践中,$ a会非常大,所以我正在寻找一种让服务器瘫痪的机会最少的方法。

(如果你解释你的版本就好像我8岁那样,请特别感谢。)

2 个答案:

答案 0 :(得分:2)

在我看来,“不会让服务器瘫痪”的方法会避免函数调用,也不会使用递归,即使两者在代码方面看起来都更清晰。无论哪种方式,这都是一个相当简单的问题。

首先,我们创建破折号数组:

$dashes = array_fill(0, count($a), array_fill(0, count($a), '-'));

您可能会注意到基于尺寸的图案:

0,0    1,0    2,0
0,1    1,1    2,1
0,2    1,2    2,2

具体而言,X和Y坐标沿对角线匹配。这很方便,因为我们只需知道一个或另一个知道插入到我们的破折号数组中的插槽。 $a中项目的索引属于(和两者):

foreach ($a as $num => $item) {
   $dashes[$num][$num] = $item;
}

答案 1 :(得分:2)

我不知道是否更有效率(您必须使用microtime()进行衡量。)

使用Array Fill可能更容易编写或理解:

$a = array("zero", "one", "cat");
$elements=count($a);
//we create the matrix and fill it with "-"
$matrix=array_fill(0,$elements,array_fill(0,$elements,"-");)
//now we have a matrix $elements x $elements (in this case will be 3x3) filled by "-"
// -  -  -
// -  -  -
// -  -  -

现在我们把数字放在

for($i = 0; $i < $elements; $i++){
  $matrix[$i][$i] = $a[$i];
}