Avatar billede kodak Mester
28. januar 2023 - 22:37 Der er 16 kommentarer

tabel opbygning

jeg vilgerne ha opbygget en table bygget på disse verdier

<?php
$xml = simplexml_load_file('work/work.xml');
$lastPart2 = '';
$table = '<table>';

foreach ($xml->TestSummary->CableID as $cableID) { //CableID kan eksempelvis være 'V03-610b-2_A.01'
    preg_match('/^(.*)_([A-Z]+)\.?([0-9]+)$/', $cableID, $matches);

    $part1 = $matches[1]; //eks. verdi 'V03-610b-2'
    $part2 = $matches[2]; //eks. verdi 'A'
    $part3 = $matches[3]; //eks. verdi '01'

for hvergang part1 ændre sig er det en ny Table
For hvergang part2 ændre sig er den en ny row
og part 3 er hver verdi i disse felter.
Avatar billede arne_v Ekspert
28. januar 2023 - 23:26 #1
Det er vel en klassisk 'last' ting.

$lastpart1 = '';
$lastpart2 = '';
$lastpart3 = '';
... {
    $part1 = ...;
    $part2 = ...;
    $part3 = ...;
    if($part1 != $lastpart1) {
        // do whatever
        $lastpart1 = $part1;
    }
    if($part2 != $lastpart2) {
        // do whatever
        $lastpart2 = $part2;
    }
    if($part3 != $lastpart3) {
        // do whatever
        $lastpart3 = $part3;
    }
}
Avatar billede kodak Mester
28. januar 2023 - 23:55 #2
det har jeg prøvet på den ene og den anden måde men jeg får kun ét output.

har også prøvet

[div]
<?php

$xml = simplexml_load_file('work/work.xml');
$table = array();

foreach ($xml->TestSummary->CableID as $cableID) {
    preg_match('/^(.*)_([A-Z]+)\.?([0-9]+)$/', $cableID, $matches);

    $part1 = $matches[1];
    $part2 = $matches[2];
    $part3 = $matches[3];

    if (!isset($table[$part1])) {
        $table[$part1] = array();
    }
    if (!isset($table[$part1][$part2])) {
        $table[$part1][$part2] = array();
    }
    $table[$part1][$part2][] = $part3;
}

foreach ($table as $part1 => $part2s) {
    echo "<table>\n";
    echo "<caption>$part1</caption>\n";
    foreach ($part2s as $part2 => $part3s) {
        echo "<thead>\n";
        echo "<tr>\n";
        echo "<th>$part2</th>\n";
        echo "</tr>\n";
        echo "</thead>\n";
        echo "<tbody>\n";
        foreach ($part3s as $part3) {
            echo "<tr>\n";
            echo "<td>$part3</td>\n";
            echo "</tr>\n";
        }
        echo "</tbody>\n";
    }
    echo "</table>\n";
}

?>
[\div]
Avatar billede arne_v Ekspert
29. januar 2023 - 00:41 #3
Den kode indeholder nestede løkker ikke  if på last.
Avatar billede arne_v Ekspert
29. januar 2023 - 01:09 #4
Men jeg prøver lige at lavet et "eksempel".
Avatar billede kodak Mester
29. januar 2023 - 01:11 #5
og har jungleret frem og tilbage med 'last'

<?php

$xml = simplexml_load_file('work/work.xml');

$lastPart1 = '';
$lastPart2 = '';
$lastPart3 = '';
$table = '<table>';

foreach ($xml->TestSummary->CableID as $cableID) {
    preg_match('/^(.*)_([A-Z]+)\.?([0-9]+)$/', $cableID, $matches);

    $part1 = $matches[1];
    $part2 = $matches[2];
    $part3 = $matches[3];
   
    if ($part2 != $lastPart2) {
        if ($lastPart2 != '') {
            $table .= '</tr>';
        }
        $table .= '<tr>';
    }
    if ($part3 != $lastPart3) {
        if ($lastPart3 != '') {
            $table .= '</td>';
        }
        $table .= '<td>' . $part2 .'.'. $part3 . '</td>';
    }
    $lastPart2 = $part2;
}

$table .= '</table>';
echo $table;
?>
Avatar billede arne_v Ekspert
29. januar 2023 - 01:14 #6

<?php

// simulated data
$data = array( array('part1' => 'x', 'part2' => '1', 'part3' => 'I'),
              array('part1' => 'x', 'part2' => '1', 'part3' => 'II'),
              array('part1' => 'x', 'part2' => '2', 'part3' => 'III'),
              array('part1' => 'x', 'part2' => '2', 'part3' => 'IV'),
              array('part1' => 'y', 'part2' => '3', 'part3' => 'V'),
              array('part1' => 'y', 'part2' => '3', 'part3' => 'VI'),
              array('part1' => 'y', 'part2' => '4', 'part3' => 'VII'),
              array('part1' => 'y', 'part2' => '4', 'part3' => 'VIII'));

$lastpart1 = '';
$lastpart2 = '';
$lastpart3 = '';
foreach($data as $rec) {
    // get the parts
    $part1 = $rec['part1'];
    $part2 = $rec['part2'];
    $part3 = $rec['part3'];
    // do it
    if($part1 != $lastpart1) {
        if($lastpart1 != '') {
            echo "</table>\r\n";
        }
        echo "$part1:\r\n";
        echo "<table border='1'>\r\n";
        $lastpart1 = $part1;
    }
    if($part2 != $lastpart2) {
        if($lastpart2 != '') {
            echo "</tr>\r\n";
        }
        echo "<tr>\r\n";
        echo "<td>$part1</td>\r\n";
        $lastpart2 = $part2;
    }
    echo "<td>$part3</td>\r\n";
}
echo "</tr>\r\n";
echo "</table>\r\n";

?>


giver:

x:
<table>
<tr>
<td>x</td>
<td>I</td>
<td>II</td>
</tr>
<tr>
<td>x</td>
<td>III</td>
<td>IV</td>
</table>
y:
<table>
</tr>
<tr>
<td>y</td>
<td>V</td>
<td>VI</td>
</tr>
<tr>
<td>y</td>
<td>VII</td>
<td>VIII</td>
</tr>
</table>
Avatar billede arne_v Ekspert
29. januar 2023 - 01:27 #7
Det ser ud som om du er på sporet nu!!
Avatar billede kodak Mester
29. januar 2023 - 10:55 #8
<?php

$xml = simplexml_load_file('work/work.xml');
   
$lastpart1 = '';
$lastpart2 = '';
$lastpart3 = '';
foreach ($xml->TestSummary->CableID as $cableID) {
    preg_match('/^(.*)_([A-Z]+)\.?([0-9]+)$/', $cableID, $matches);

    $part1 = $matches[1];
    $part2 = $matches[2];
    $part3 = $matches[3];
    // do it
    if($part1 != $lastpart1) {
        if($lastpart1 != '') {
            echo "</table>\r\n";
        }
        echo "$part1:\r\n";
        echo "<table border='1'>\r\n";
        $lastpart1 = $part1;
    }
    if($part2 != $lastpart2) {
        if($lastpart2 != '') {
            echo "</tr>\r\n";
        }
        echo "<tr>\r\n";
        echo "<td>$part1</td>\r\n";
        $lastpart2 = $part2;
    }
    echo "<td>$part3</td>\r\n";
}
echo "</tr>\r\n";
echo "</table>\r\n";

?>

Giver mig ikke mere end.

Output:
V03-610b-2:
<table border='1'>
<tr>
<td>V03-610b-2</td>
<td>01</td>
</tr>
</table>

så af en eller anden orsag, får jeg ikke mere data.
Avatar billede arne_v Ekspert
29. januar 2023 - 20:33 #9
Er det den rigtige XML fil?

Den foreach bør udskrive noget for hvert id fundet uanset al last logikken.
Avatar billede kodak Mester
29. januar 2023 - 21:20 #10
Yep
det var også min tanke, men det er korrekt fil.
Avatar billede arne_v Ekspert
29. januar 2023 - 21:38 #11
Debug time!

Time to insert the usual gazillion echo statement (unless you use a logging framework)
and find out what is going on.
Avatar billede arne_v Ekspert
29. januar 2023 - 21:43 #12
Undskyld det lige blev på engelsk.
Avatar billede arne_v Ekspert
29. januar 2023 - 21:43 #13
Og så den klassiske vits om debugging:

If debugging is the process of removing software bugs, then programming must be the process of putting them in.

(skulle oprindeligt komme fra Dijkstra)
Avatar billede erikjacobsen Ekspert
09. februar 2023 - 17:11 #14
Der er sikkert også en kendt person fra gamle dage, der har sagt at man skal kaste alt op i luften så det hele falder ned på en ny måde. Jeg foretrækker denne metode:

// simulated data
$data = array( array('part1' => 'x', 'part2' => '1', 'part3' => 'I'),
              array('part1' => 'x', 'part2' => '1', 'part3' => 'II'),
              array('part1' => 'x', 'part2' => '2', 'part3' => 'III'),
              array('part1' => 'x', 'part2' => '2', 'part3' => 'IV'),
              array('part1' => 'y', 'part2' => '3', 'part3' => 'V'),
              array('part1' => 'y', 'part2' => '3', 'part3' => 'VI'),
              array('part1' => 'y', 'part2' => '4', 'part3' => 'VII'),
              array('part1' => 'y', 'part2' => '4', 'part3' => 'VIII'));

$t = [];
foreach ($data as $d) {
  $t[$d['part1']][$d['part2']][]=$d['part3'];  // man er vel en nørd...
}
//print_r($t);

foreach ($t as $k=>$a) {
  print("$k:\n");
  print("<table>\n");
  foreach ($a as $k1=>$a1) {
    print("<tr>\n");
    foreach ($a1 as $k2=>$a2) {
      print("<td>$a2</td>\n");
    }
    print("</tr>\n");
  }
  print("</table>\n");
}


x:
<table>
<tr>
<td>I</td>
<td>II</td>
</tr>
<tr>
<td>III</td>
<td>IV</td>
</tr>
</table>
y:
<table>
<tr>
<td>V</td>
<td>VI</td>
</tr>
<tr>
<td>VII</td>
<td>VIII</td>
</tr>
</table>
Avatar billede arne_v Ekspert
09. februar 2023 - 17:39 #15
@erik

Ja - den kode er pænere.

"last teknikken" kommer vel fra streaming kontekst f.eks. database result sets.
Avatar billede erikjacobsen Ekspert
09. februar 2023 - 18:51 #16
En enkelt $last kan jeg finde ud af ;)  Men man skal jo lige have RAM nok til min løsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester