PHP对齐多个不同长度的数组

时间:2018-02-01 22:14:49

标签: php arrays visualization data-visualization

我可能只是忽略了显而易见的事情,但我想将其归咎于我是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-1s1-2s1-3或只是s1-1。这会产生非常不同大小的数组。

问题是每个数组可能有非常不同的信息,因为它们是索引数组而不是关联数组,我不知道如何最好地均衡它们。我不能一直说索引3是s1-3或其他东西。

我不能手动循环,因为我永远不知道差距会出现在哪里。我无法查找特定的索引,因为数组不是关联的,因此标题内置于值中,我不知道如何单独访问它们。

那里有什么好主意可能是新手可以忽略的?我对非表格显示的想法持开放态度,只要我能够轻松地对信息进行排序和显示。

由于

2 个答案:

答案 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