2

给定一个字符串数组,例如 $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 岁一样解释您的版本,则非常感谢。)

4

2 回答 2

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 坐标沿对角线匹配。这很方便,因为我们只需要知道一个或另一个就可以知道要插入到 dashes 数组中的插槽。项目的索引$a符合以下条件之一(和两者):

foreach ($a as $num => $item) {
   $dashes[$num][$num] = $item;
}
于 2012-12-04T20:14:00.687 回答
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];
}
于 2012-12-04T20:20:43.660 回答