我有两个数组,它们总是具有相同的长度:
$unit = array('a','b','c','d','a','b','d');
$type = array('x','y','z','x','y','z','x');
也可能有更多类型的单位或类型。例如:单位可能是5而不是4(a,b,c,d),类型可能是5而不是3(x,y,z)。但是两个数组的长度是相同的
现在用这些数据我想创建一个这样的表:
x y z
a 1 1
b 1 1
c 1
d 2
到目前为止我做了什么:
$TYPE = array_values(array_unique($type));
$UNIT = array_values(array_unique($unit));
这两个将提供第一列和第一行。
echo "<table border='1' cellpadding='5' cellspacing='0' style='border-collapse:collapse;'>";
echo "<tr><td>" . ' ' . "</td>";
$lengthtype = count($TYPE);
for($i=0; $i<$lengthtype; $i++)
{
echo "<td>" . $TYPE[$i] . "</td>";
}
echo "</tr>";
$unitlength = count($UNIT);
for($i=0; $i<$unitlength;$i++)
{
echo "<tr>";
echo "<td>" . $UNIT[$i] . "</td>";
echo "</tr>";
}
echo "</table>";
我认为我需要将两者结合起来创建2D数组所以我这样做了:
$newarray = array();
foreach($type as $key=>$val)
{
$newarray[$key][]=$val;
$newarray[$key][]=$unit[$key];
}
现在我不能确定什么是有效的方式进行?
如果你们能提供任何提示,那就太好了。
更新:
我的问题是如何在第二个块中创建表。说明一下,1和2是数字,空格可以是0
这应该可以为您工作:
在开始时,你可以使用for循环一次遍历两个数组并创建一个数组,其中每个$TYPE
是subArray的键,并且在每个subArray中计算哪个$UNIT
出现在相同的位置。
表示创建一个像这样的数组:
Array
(
//↓ Each '$TYPE'
[x] => Array
(
[a] => 1
[d] => 2
//↑ ↑ Amount
//Each '$UNIT', which occurs at the same position as this type
)
[y] => Array
(
[b] => 1
[a] => 1
)
[z] => Array
(
[c] => 1
[b] => 1
)
)
在此之后,它只是简单地打印您想要的数据。对于这个,你循环通过所有唯一的$UNITS
,你得到array_unique()
。对于每个单位,你循环遍历所有唯一的$TYPE
。你只需要检查数组中是否有元素,然后打印出来。
<?php
$UNIT = array('a','b','c','d','a','b','d');
$TYPE = array('x','y','z','x','y','z','x');
$count = [];
for($i = 0, $length = count($UNIT); $i < $length; $i++) {
if(!isset($count[$TYPE[$i]][$UNIT[$i]]))
$count[$TYPE[$i]][$UNIT[$i]] = 0;
$count[$TYPE[$i]][$UNIT[$i]]++;
}
echo "<table border='1' cellpadding='5' cellspacing='0' style='border-collapse:collapse;'>";
echo "<tr><td></td><td>" . implode("</td><td>", array_unique($TYPE)) . "</td></tr>";
foreach(array_unique($UNIT) as $key){
echo "<tr><td>$key</td>";
foreach(array_unique($TYPE) as $v)
echo "<td>" . (isset($count[$v][$key]) ? $count[$v][$key] : "") . "</td>";
echo "<tr>";
}
echo "</table>";
?>
输出: x y z
a 1 1
b 1 1
c 1
d 2