0

我有一个从我的数据库中获取结果的查询。

结果集如下所示(打印到浏览器时):

Array ([experimentid] => 56  [optimizationtype] => mvt [primarykpilift] => 22.26 [variableid] => 36 [variabletype] => 9 [valueid] => 133 [20] => 22.24 [valuelift] => 22.24 [valuesignificant] => 1 ) 

Array ([experimentid] => 57 [optimizationtype] => mvt [primarykpilift] => 22.23 [variableid] => 37 [variabletype] => 7 [valueid] => 135 [valuelift] => 77.74 [valuesignificant] => 1)

Array ([experimentid] => 57 [optimizationtype] => mvt [primarykpilift] => 22.23 [variableid] => 38 [variabletype] => 15 [valueid] => 136 [valuelift] => 224.36 [valuesignificant] => 1) 

Array ([experimentid] => 57 [optimizationtype] => mvt [primarykpilift] => 22.23 [variableid] => 39 [variabletype] => 4 [valueid] => 138 [valuelift] => 77.78 [valuesignificant] => 1) 

Array ([experimentid] => 57 [optimizationtype] => mvt [primarykpilift] => 22.23 [variableid] => 39 [variabletype] => 4 [valueid] => 137 [valuelift] => 77.77 [valuesignificant] => 1) 

您会注意到,有些结果看起来完全一样,但差别不大。这是因为数据位于由 INNER JOIN 语句连接的 3 个表中。
我要做的是在适用时将这些数组合并为一个数组。

例如,

请注意这里有 4 个数组,其中 57 作为实验 ID?这些都是我想要巩固的记录。一个简单的合并或相交似乎不会起作用。

这是我正在寻找的逻辑。

如果当前和以前的 id 之间的实验 id 相同,则合并数组,以便匹配信息仅显示一次,并且应合并所有唯一信息。

例如 - 如果我们要合并共享相同实验 ID 的 4 个数组,它们看起来像这样:

([experimentid] => 57 [optimizationtype] => mvt [primarykpilift] => 22.23 [variableid] => 37 [variabletype] => 7 [valueid] => 135 [valuelift] => 77.74 [valuesignificant] => 1 [variableid] => 38 [variabletype] => 15 [valueid] => 136 [valuelift] => 224.36 [valuesignificant] => 1 [variableid] => 39 [variabletype] => 4 [valueid] => 138 [valuelift] => 77.78 [valuesignificant] => 1 [valueid] => 137 [valuelift] => 77.77 [valuesignificant] => 1)

请注意,如果 variableid 匹配,冗余信息不会添加到数组中?另外,请注意如何只有一个experimentid 实例?

我这样做的原因是因为我想如何在屏幕上显示我的结果。如果我只是按原样显示结果,最终用户会看到相同实验的 4 个实例,只是略有不同。我希望他们知道他们正在查看 1 个实验,但有多个细节(变量 ID 和 valueid 相关),这就是为什么我想根据实验(有时是 variableid)id 来整合我的数组。

到目前为止,我已经编写了一些代码来检查数组是否匹配,但我陷入了如何合并相似数组的困境......

$previousexpid = blah;
$previousvarid = blahs;
while ($row = mysqli_fetch_array($result))
{
print_r($row);

if ($row['experimentid'] === $previousexpid  && $row['variableid'] === $previousvarid) 
     {
    echo "experiment & variable";
     }
elseif ($row['experimentid'] === $previousexpid) 
     {
   echo "experiment only"; 
     }
else
     {
    echo "do not match";
     }
  echo "<br><br>"; 
$previousexpid = $row['experimentid'];
$previousvarid = $row['variableid']; 
}







更新 10/21

我稍微修改了您的代码以考虑我以前未包含的字段以尝试简化事情。这是更新的代码。

$rows[$row['experimentid']]['experimentid'] = $row['experimentid'];
$rows[$row['experimentid']]['optimizationtype'] = $row['optimizationtype'];
$rows[$row['experimentid']]['primarykpilift'] = $row['primarykpilift'];
$rows[$row['experimentid']]['variables'][$row['variableid']]['variableid'] =      $row['variableid'];
$rows[$row['experimentid']]['variables'][$row['variableid']]['variabletype'] =   $row['variabletype'];
$rows[$row['experimentid']]['variables'][$row['variableid']]['controlimage'] = $row['controlimage'];
$rows[$row['experimentid']]['variables'][$row['variableid']]['values'][$row['valueid']]['valueid'] = $row['valueid'];
$rows[$row['experimentid']]['variables'][$row['variableid']]['values'][$row['valueid']]['valueimage'] = $row['valueimage'];
$rows[$row['experimentid']]['variables'][$row['variableid']]['values'][$row['valueid']]['valuelift'] = $row['valuelift'];
$rows[$row['experimentid']]['variables'][$row['variableid']]['values'][$row['valueid']]['valuesignificant'] = $row['valuesignificant'];

它输出的数组之一是:

Array ( [59] => Array ( [experimentid] => 59 [optimizationtype] => mvt [primarykpilift] => 72.61 [variables] => Array ( [42] => Array ( [variableid] => 42 [variabletype] => Contact Module [controlimage] => -nsvsuc-control-contactmodule-headline.jpg [values] => Array ( [142] => Array ( [valueid] => 142 [valueimage] => -nsvsuc-contactspecialist-contactmodule-headline.jpg [valuelift] => 21.65 [valuesignificant] => 1 ) [141] => Array ( [valueid] => 141 [valueimage] => -nsvsuc-getstartedtoday-contactmodule-headline.jpg [valuelift] => 4.12 [valuesignificant] => ) ) ) [43] => Array ( [variableid] => 43 [variabletype] => Contact Module [controlimage] => -nsvsuc-control-contactmodule-cta.jpg [values] => Array ( [144] => Array ( [valueid] => 144 [valueimage] => -nsvsuc-haveuscall-contactmodule-cta.jpg [valuelift] => 24.74 [valuesignificant] => 1 ) [143] => Array ( [valueid] => 143 [valueimage] => -nsvsuc-requestconsultation-contactmodule-cta.jpg [valuelift] => 1.03 [valuesignificant] => ) ) ) [44] => Array ( [variableid] => 44 [variabletype] => Contact Module [controlimage] => -nsvsuc-control-contactmodule-presence.jpg [values] => Array ( [145] => Array ( [valueid] => 145 [valueimage] => -nsvsuc-footerl-contactmodule-presence.jpg [valuelift] => 37.08 [valuesignificant] => 1 ) ) ) ) )

这基本上就是我希望它看起来的样子:

<div>
<table>
<tr><td>MVT</td></tr>
<tr><td>72.61</td></tr>
<tr>
<table>
<tr>
<td>Contact Module</td><td>Contact Module</td><td>Contact Module</td>
</tr>
<tr>
<td>-nsvsuc-control-contactmodule-headline.jpg</td><td>-nsvsuc-control-contactmodule-cta.jpg</td><td>nsvsuc-control-contactmodule-presence.jpg</td>
</tr>
<tr>
<td>-nsvsuc-contactspecialist-contactmodule-headline.jpg</td><td>-nsvsuc-haveuscall-contactmodule-cta.jpg</td><td>-nsvsuc-footerl-contactmodule-presence.jpg</td>
</tr>
<tr>
<td>21.65</td><td>24.74</td><td>37.08</td>
</tr>
<tr>
<td>-nsvsuc-getstartedtoday-contactmodule-headline.jpg</td><td>-nsvsuc-requestconsultation-contactmodule-cta.jpg</td><td>null</td>
</tr>
<tr>
<td>4.12</td><td>1.03</td><td>null</td>
</tr>
</table>
</tr>
</table>
</div>

每个变量可以有多个值,因此在此示例中,变量 [42] 和 [43] 每个变量有 2 个值,但有些变量可能有 n 个值,所以我需要以某种方式循环遍历以重复输出。

归根结底,变量是行标题,值位于关联值的下方。

4

2 回答 2

1

鉴于您的数据结构是关系层次结构,如果您尝试连接所有表然后解析数据,我认为您只是在自找麻烦。相反,我建议创建迭代每个表(引用父表的值)的嵌套循环,以便输出所需的数据。

我确信有相当干净的方法来编写此代码,但它为您提供了您要完成的工作的要点:

<?php
// Helper functions to output table HTML.
function p_table($rows) {
  global $tb, $indent;
  if (is_array($rows)) {
    $rows = implode("", $rows);
  }
  return "\n<table>\n" . $rows . "</table>\n";
}
function p_tr($cells) {
  if (is_array($cells)) {
    $cells = implode("", $cells);
  }
  return "<tr>\n" . $cells . "</tr>\n";
}
function p_td($cell) {
  $cell = $cell . "\n";
  return "<td valign=\"top\">\n" . $cell . "</td>\n";
}

// Start iterating over each table.
$exp_table = array();
$exp_results = mysql_query("SELECT * FROM experiments");
while ($exp_row = mysql_fetch_array($exp_results, MYSQL_ASSOC)) {

  // Output the experiment data rows.
  $exp_table[] = p_tr(p_td($exp_row['optimizationtype']));
  $exp_table[] = p_tr(p_td($exp_row['primarykpilift']));

  // Create a placeholder that the variables columns will fit into.
  $exp_var_columns = array();

  $var_results = mysql_query("SELECT * FROM `variables` WHERE experimentid = " . $exp_row['experimentid']);
  while ($var_row = mysql_fetch_array($var_results, MYSQL_ASSOC)) {

    // Create a new table to hold variables data and associated values data.
    $var_table = array();
    $var_table[] = p_tr(p_td($var_row['variabletype']));
    $var_table[] = p_tr(p_td($var_row['controlimage']));

      // Output the values as consecutive rows.
      $val_table = array();
      $val_results = mysql_query("SELECT * FROM `values` WHERE variableid = " . $var_row['variableid']);
      while ($val_row = mysql_fetch_array($val_results, MYSQL_ASSOC)) {

        // Output the valiable data.
        $val_table[] = p_tr(p_td('IM' . $val_row['valueimage']));
        $val_table[] = p_tr(p_td('VL' . $val_row['valuelift']));

      }
      $val_table = p_table($val_table);

    // Include the values table as a row beneath the variables data.
    $var_table[] = p_tr(p_td($val_table));

    $var_table = p_table($var_table);

    // Add the var table as a column
    $exp_var_columns[] = p_td($var_table);
  }

  // Output the var columns.
  $exp_table[] = p_tr($exp_var_columns);
}

$page_data[] = p_table($exp_table);

print implode("<hr>", $page_data);
?>
于 2013-10-25T15:19:18.053 回答
0

如果我正确理解了您的数据库表的组织,您将拥有三个“键”,它们使每一行的结果都是唯一的——experimentid、variableid 和 valueid。您需要一种嵌套唯一值的方法。这是一些将不同值合并到子数组中的代码。

<?php
$rows = array();
while ($row = mysqli_fetch_array($result)) {
  $rows[$row['experimentid']]['experimentid'] = $row['experimentid'];
  $rows[$row['experimentid']]['optimizationtype'] = $row['optimizationtype'];
  $rows[$row['experimentid']]['primarykpilift'] = $row['primarykpilift'];
  $rows[$row['experimentid']]['variables'][$row['variableid']]['variableid'] = $row['variableid'];
  $rows[$row['experimentid']]['variables'][$row['variableid']]['variabletype'] = $row['variabletype'];
  $rows[$row['experimentid']]['variables'][$row['variableid']]['values'][$row['valueid']]['valueid'] = $row['valueid'];
  $rows[$row['experimentid']]['variables'][$row['variableid']]['values'][$row['valueid']]['valuelift'] = $row['valuelift'];
  $rows[$row['experimentid']]['variables'][$row['variableid']]['values'][$row['valueid']]['valuesignificant'] = $row['valuesignificant'];
}
?>

尽管上面的代码非常难看,并且可以以更易读的格式重写,但它让您了解数据的嵌套方式。

您可以使用print_r($rows);(或print '<pre>'.print_r($rows,true).'</pre>';)查看数据的嵌套。

于 2013-10-20T14:02:11.783 回答