我有一个从我的数据库中获取结果的查询。
结果集如下所示(打印到浏览器时):
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 个值,所以我需要以某种方式循环遍历以重复输出。
归根结底,变量是行标题,值位于关联值的下方。