[PHP] DOM insertBefore zorgt voor oneindige loop?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Ben de wereld van de PHP5-DOM ingedoken, maar dat valt nog niet mee! De documentatie op www.php.net is nog niet je-dat.

Ik heb een probleem: ik heb een HTML tabel, en in die tabel wil ik voor iedere cel een nieuwe cel invoegen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$xml = '<table>
                <tr>
                  <td>A</td><td>B</td>
                </tr>                
                <tr>
                  <td>C</td>
                </tr>
               </table>';

$doc = new DOMDocument();               
$doc->loadXML($xml);               

$aoCells = $doc->getElementsByTagName('td');

/* add form element cell */
foreach ($aoCells as $oCell)
{    
  $oTdElement = $doc->createElement('td');
  $oTdElement->value="<input type='text'>";
  
  $oCell->parentNode->insertBefore($oTdElement);  
}

/* 
desired output:

$xml = '<table>
                <tr>
                  <td><input type='text'></td><td>A</td><td><input type='text'></td><td>B</td>
                </tr>                
                <tr>
                  <td><input type='text'></td><td>C</td>
                </tr>
               </table>';
*/


Het probleem is dat bovenstaande code een oneindige loop geeft, waardoor de pagina niet wordt geladen. Ik denk dat het komt doordat de nieuwe cel $oTdElement aan $aoCells wordt toegevoegd, waardoor hij die ook meeneemt in de foreach-loop.

Hoe kan ik dit voorkomen? Vreemd, in Javascript heb ik hier geloof ik nooit problemen mee gehad :?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 21:18

crisp

Devver

Pixelated

In javascript is de nodelist die teruggegeven wordt door getElementsByTagName ook een 'live' nodelist.
Waarom gebruik je overigens niet createElement voor je input-element?

Anyway: de oplossing is natuurlijk door je pointer te verschuiven of door de nodelist van achter naar voren door te lopen met een for- of while-lus ipv een foreach.

[ Voor 32% gewijzigd door crisp op 27-02-2007 14:23 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Anyway: de oplossing is natuurlijk door je pointer te verschuiven of door de nodelist van achter naar voren door te lopen met een for- of while-lus ipv een foreach.
Dat snap ik, maar ik wist niet hoe dat moest (je kunt niet 'loopen' met for ($i=count($aoCells).... want $aoCells is geen normale array).

Maar goed ik heb de oplossing:

PHP:
1
2
3
4
5
6
7
for ($i=$aoCells->length-1; $i>=0; $i--)
{
  $oCell = $aoCells->item($i);

  $oTdElement = $oDomDocument->createElement('td');     
  $oCell->parentNode->insertBefore($oTdElement, $oCell);   
}


Dank!