如何从sql合并数组

时间:2013-10-20 13:15:10

标签: php sql arrays

我有一个查询,可以从我的数据库获得结果。

结果设置如下(打印到浏览器时):

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相同,则合并数组,以便匹配信息仅显示一次,并且应合并所有唯一信息。

例如,如果我要整合共享相同实验的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)

注意如果变量id匹配,冗余信息没有添加到数组中?另外,请注意实验中只有一个实例?

我这样做的原因是因为我想将结果显示在屏幕上。如果我只是按原样显示结果,最终用户将看到同一实验的4个实例,只是有细微差别。我希望他们知道他们正在研究1个实验,但有多个细节(变量和valueid相关),这就是为什么我想基于实验(有时是变量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个值,所以不知怎的,我需要循环遍历事物来重复输出

在一天结束时,变量是行标题,值放在相关值的下方。

2 个答案:

答案 0 :(得分: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);
?>

答案 1 :(得分: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>';)查看数据的嵌套。