使用自定义循环并排打印 PHP 中的两个多维数组
Printing Two Multidimensional Arrays in PHP with Custom Loop Side by Side
我在 PHP 中有两个多维数组,有时会变成 4 层深。
这些数组是根据 JSON API 构建的,需要在 table 中并排打印,以便每天进行比较。
到目前为止,我使用自定义递归循环来打印它们,因为 array_walk_recursive 不会在具有自定义循环功能的 table 标签中打印它们。
这是我的循环:
function pretty_dump($arr, $d=1){
if ($d==1) echo "<pre>"; // HTML Only
if (is_array($arr)){
foreach($arr as $k=>$v){
for ($i=0;$i<$d;$i++){
echo "_";
}
if (is_array($v)){
echo '<span class="red">'. $k.PHP_EOL . "</span>";
Pretty_Dump($v, $d+1);
} else {
echo '<span class="label"><strong>' . $k . "</strong>" ."</span>"."\t".'<span
class="value">'.$v.PHP_EOL. "</span>";
}
}
}
if ($d==1) echo "</pre>"; // HTML Only
然后我这样调用数组,在 table:
<tr>
<td>
<?
pretty_dump ($result);
?>
</td>
<td>
<?
pretty_dump ($result2);
?>
</td>
<td>
<?
pretty_dump ($result3);
?>
</td>
</tr>
我的问题是我需要将所有三个数组($result、$result2、$result3)与 $result(第一个数组)的键进行比较。我需要以某种方式设置 table,以便如果 $result 中某个键没有值,则 $result 旁边的列中应该有一个 NA 或空白。
例如,如果 $result2 没有对应的 $result 键的值,它应该在 $result2 的那个 td 标签中打印一个 NA。
所以在反复试验之后,我想通了:
我把数组展平了,一个一个挑出我想要的,请看下面的工作代码:
<?
$GLOBALS['seconddata'] = $result2;
$GLOBALS['thirddata'] = $result3;
$GLOBALS['fourthdata'] = $finalresults5;
function pretty_dump($arr, $d=1, $parentKey=null) {
function flatten($array, $prefix = '') {
$return = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
$return = array_merge($return, flatten($value, $prefix . $key . '_'));
} else {
$tableRow = "<tr>";
$brackets = $prefix . $key;
$tableRow .= "<td id='Firstdata'> {$brackets} </td>";
$tableRow .= "<td> {$value} </td>";
$splitResult = explode("_", $brackets);
$output = $GLOBALS['seconddata'];
$output2 = $GLOBALS['thirddata'];
$output3 = $GLOBALS['fourthdata'];
foreach( $splitResult as $key2 => $value2){
if(isset($output[$value2])){
$output = $output[$value2];
}
else{
$output = '<span class="red">Non-Existant</span>';
}
if(isset($output2[$value2])){
$output2 = $output2[$value2];
}
else{
$output2 = '<span class="red">Non-Existant</span>';
}
}
if(isset($output3[$brackets])){
$output3 = $output3[$brackets];
}
else{
$output3 = '<span class="red">Non-Existant</span>';
}
$difVal = "";
if($output != $value){
$difVal = "difference-cell";
}
$tableRow .= '<td id="seconddata" class="' . $difVal . '" >' . $output . "</td>";
$tableRow .= '<td id="thirddata">' . $output2 . "</td>";
$tableRow .= '<td id="fourthdata">' . $output3 . "</td>";
$tableRow .= "</tr>";
echo $tableRow;
}
}
return $return;
}
flatten($arr);
}
?>
<table class="table">
<thead>
<tr>
<th>First Data Keys</th>
<th>First Data Values</th>
<th>Second Data Values</th>
<th>Third Data Values</th>
<th>Fourth Data Values</th>
</tr>
</thead>
<tbody>
<?
pretty_dump ($result);
?>
</tbody>
</table>
此代码获取数据源,将它们连同它们的键一起打印到 table 中,然后比较它们并为它们的值的差异着色。
我在 PHP 中有两个多维数组,有时会变成 4 层深。
这些数组是根据 JSON API 构建的,需要在 table 中并排打印,以便每天进行比较。
到目前为止,我使用自定义递归循环来打印它们,因为 array_walk_recursive 不会在具有自定义循环功能的 table 标签中打印它们。
这是我的循环:
function pretty_dump($arr, $d=1){
if ($d==1) echo "<pre>"; // HTML Only
if (is_array($arr)){
foreach($arr as $k=>$v){
for ($i=0;$i<$d;$i++){
echo "_";
}
if (is_array($v)){
echo '<span class="red">'. $k.PHP_EOL . "</span>";
Pretty_Dump($v, $d+1);
} else {
echo '<span class="label"><strong>' . $k . "</strong>" ."</span>"."\t".'<span
class="value">'.$v.PHP_EOL. "</span>";
}
}
}
if ($d==1) echo "</pre>"; // HTML Only
然后我这样调用数组,在 table:
<tr>
<td>
<?
pretty_dump ($result);
?>
</td>
<td>
<?
pretty_dump ($result2);
?>
</td>
<td>
<?
pretty_dump ($result3);
?>
</td>
</tr>
我的问题是我需要将所有三个数组($result、$result2、$result3)与 $result(第一个数组)的键进行比较。我需要以某种方式设置 table,以便如果 $result 中某个键没有值,则 $result 旁边的列中应该有一个 NA 或空白。
例如,如果 $result2 没有对应的 $result 键的值,它应该在 $result2 的那个 td 标签中打印一个 NA。
所以在反复试验之后,我想通了:
我把数组展平了,一个一个挑出我想要的,请看下面的工作代码:
<?
$GLOBALS['seconddata'] = $result2;
$GLOBALS['thirddata'] = $result3;
$GLOBALS['fourthdata'] = $finalresults5;
function pretty_dump($arr, $d=1, $parentKey=null) {
function flatten($array, $prefix = '') {
$return = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
$return = array_merge($return, flatten($value, $prefix . $key . '_'));
} else {
$tableRow = "<tr>";
$brackets = $prefix . $key;
$tableRow .= "<td id='Firstdata'> {$brackets} </td>";
$tableRow .= "<td> {$value} </td>";
$splitResult = explode("_", $brackets);
$output = $GLOBALS['seconddata'];
$output2 = $GLOBALS['thirddata'];
$output3 = $GLOBALS['fourthdata'];
foreach( $splitResult as $key2 => $value2){
if(isset($output[$value2])){
$output = $output[$value2];
}
else{
$output = '<span class="red">Non-Existant</span>';
}
if(isset($output2[$value2])){
$output2 = $output2[$value2];
}
else{
$output2 = '<span class="red">Non-Existant</span>';
}
}
if(isset($output3[$brackets])){
$output3 = $output3[$brackets];
}
else{
$output3 = '<span class="red">Non-Existant</span>';
}
$difVal = "";
if($output != $value){
$difVal = "difference-cell";
}
$tableRow .= '<td id="seconddata" class="' . $difVal . '" >' . $output . "</td>";
$tableRow .= '<td id="thirddata">' . $output2 . "</td>";
$tableRow .= '<td id="fourthdata">' . $output3 . "</td>";
$tableRow .= "</tr>";
echo $tableRow;
}
}
return $return;
}
flatten($arr);
}
?>
<table class="table">
<thead>
<tr>
<th>First Data Keys</th>
<th>First Data Values</th>
<th>Second Data Values</th>
<th>Third Data Values</th>
<th>Fourth Data Values</th>
</tr>
</thead>
<tbody>
<?
pretty_dump ($result);
?>
</tbody>
</table>
此代码获取数据源,将它们连同它们的键一起打印到 table 中,然后比较它们并为它们的值的差异着色。