我可能只是忽略了显而易见的事情,但我想将其归咎于我是PHP的新手。
我有一些数组返回的信息类似,但数量不同。
我将在下面放一些示例数组:
(t1-s1-1=1, t1-s1-2=1, t1-s2-1=1, t1-s2-2=1)
(t2-s1-1=1, t2-s2-1=2, t2-s2-2=1)
(t3-s1-1=1, t3-s2-1=1, t3-s3-1=1, t3-s3-2=3)
所以我想根据这些信息制作一张表格。像这样:
test .. s1-1 .. s1-2 .. s2-1 .. s2-2 .. s3-1 .. s3-2
t1 ........1 .....1 ..........1 ....... 1.........1..........1
t2 ........1 .......X..........1..........1........1..........1
t3 ........1 .......X..........1..........X........1..........1
(其中x是不存在的东西。)
因此,每个数组都有一个s1
,但可以有s1-1
,s1-2
,s1-3
或只是s1-1
。这会产生非常不同大小的数组。
问题是每个数组可能有非常不同的信息,因为它们是索引数组而不是关联数组,我不知道如何最好地均衡它们。我不能一直说索引3是s1-3
或其他东西。
我不能手动循环,因为我永远不知道差距会出现在哪里。我无法查找特定的索引,因为数组不是关联的,因此标题内置于值中,我不知道如何单独访问它们。
那里有什么好主意可能是新手可以忽略的?我对非表格显示的想法持开放态度,只要我能够轻松地对信息进行排序和显示。
由于
答案 0 :(得分:0)
尝试以下方法:
$final_array = array();
$temp_array = array();
foreach ($t1 as $t) {
$isin = 0;
$expression = substr($t, 0, strpos($t, "="));
$expression = str_replace("t1-", "" , $expression)
$value = substr($t, strpos($t, "=") + 1);
for ($i = 0; $i < 3; $i++) {
foreach ($x = 0; $x < 3; $x++) {
if ($expression == "s{$i}-{$x}") {
$isin = 1;
array_push($temp_array, $value);
}
}
}
if ($isin == 0) { array_push($temp_array, "X"); }
}
array_push($final_array, $temp_array);
这不是一个很好的解决方案,因为你选择以一种非常奇怪的方式做到这一点,但你应该看到如何从这个例子中获得你想要的东西的要点。
答案 1 :(得分:0)
我假设您的原始数组包含值为字符串,因此,例如,在PHP语法中,它们看起来像:
['t1-s1-1=1', 't1-s1-2=1', 't1-s2-1=1', 't1-s2-2=1']
基本上,你应该创建一个二维数组:
t1
(二维数组中第一个级别的索引),{ {1}}(二维数组中第二级的索引)和值s1-1
1
)之间调用它allColumns
,即使您有重复的值,最后也可以删除这些副本和按字母顺序排列之后,你将拥有二维数组中的所有值,但是你仍然会错过这些空白,所以你可以做的是迭代二维数组,以及每个维sx-y
(t1 ,t2,...),对tz
中存储的所有值进行检查,如果你在{{1}的二维数组中找不到allColumns
的条目添加值为sx-y
(或者可能为value = 0)
我认为一个例子可以澄清以上内容:
tz
要打印输出,您只应迭代x
这将是内部数组:
// arrays of arrays, I don't know how you receive the data
$arrays = [
['t1-s1-1=1', 't1-s1-2=1', 't1-s2-1=1', 't1-s2-2=1'],
['t2-s1-1=1', 't2-s2-1=2', 't2-s2-2=1'],
['t3-s1-1=1', 't3-s2-1=1', 't3-s3-1=1', 't3-s3-2=3']
];
// bi-dimensional array
$output = [];
// it will store all columns you find in the $arrays entry
$allColumns = [];
// iterate for every array you receive, i.e. ['t1-s1-1=1', 't1-s1-2=1', 't1-s2-1=1', 't1-s2-2=1']
foreach ($arrays as $array) {
// iterate over every element in the array: 't1-s1-1=1', 't1-s1-2=1', 't1-s2-1=1' and 't1-s2-2=1'
foreach ($array as $item) {
// extract the parts on every element: $matches is an array containing the different parts
preg_match('/^(t\d+)-(s\d+-\d+)=(\d+)/', $item, $matches);
/**
* $matches[0] would contains the element if matched: 't1-s1-1=1'
* $matches[1] would contains 't1' if matched
* $matches[2] would contains 's1-1' if matched
* $matches[2] would contains 1 (integer) if matched
*/
if (!empty($matches)) {
$output[$matches[1]][$matches[2]] = $matches[3];
$allColumns[] = $matches[2];
}
}
}
// clean duplicates
$allColumns = array_unique($allColumns);
// sort values alphabetically
sort($allColumns);
// iterate over the just created bi-dimensional array
foreach ($output as $row => $columns) {
// iterate for all columns collected before
foreach ($allColumns as $column) {
// if one of column in 'allColumns' doesn't exit in $output you added in the correct place adding a zero value
if (!in_array($column, array_keys($columns))) {
$output[$row][$column] = 0;
}
}
}
存在其他实现上述方法的方法,例如跳过填补空白的步骤并动态执行,...
<强>更新强> 在HTML页面中显示结果的最简单方法是嵌入一个php脚本来迭代关联数组并编写HTML表格(我鼓励你研究和研究MVC以从视图中分离逻辑)
$ouput