PHP - For döngüsü sadece dizideki son değişken döndürür

3 Cevap php

Ben PHP döngü için bir tek benim dizideki son öğeyi döndürür garip bir sorun var.

Dizi bir XML dosyası SimpleXML ile oluşturulur.

Kod bu dönmelidir:

<tags><tag value="Tag1" /><tag value="Tag2" /><tag value="Tag3" /></tags>

Ama onun yerine ben alıyorum:

<tags><tag value="Tag3" /></tags>

Bu yüzden ne olursa olsun ben orada var kaç dizideki son öğe ancak tüm sayar.

Herkes yanlış ne yapıyorum görebilir miyim?

İşte kod:

<?php

function gettags($xml)
{
    $xmltags = $xml->xpath('//var[@name="infocodes"]/string');
    return $xmltags[0];
}

//Path to the XML files on the server
$path = "/xmlfiles/";

//Create an array with all the XML files
$files = glob("$path/*.xml");

foreach($files as $file)
{
    $xml = simplexml_load_file($file);
    $xmltags = gettags($xml);

//Using the , character split the values coming from the $xmltags into an array
$rawtags = explode(',', $xmltags);

//Loop through the tags and add to a variable. Each tag will be inside an XML element - <tag value="tagname" />
for ($i = 0; $i <count($rawtags); $i++){
    $tags = '<tag value="' . $rawtags[$i] . '" />';
}

//Replace HTML escaped characters (ä, å, ö, Å, Ä, Ö) and the | character with normal characters in the tags variable
$tagsunwantedchars = array("&Ouml;", "&Auml;", "&Aring;", "&ouml;", "&auml;", "&aring;", "|");
$tagsreplacewith = array("Ö", "Ä", "Å", "ö", "ä", "å", " - ");
$tagsclean = str_replace($tagsunwantedchars, $tagsreplacewith, $tags);

//Create the full tag list and store in a variable
$taglist = "<tags>$tagsclean</tags>";

}

echo $taglist;

?>

İşte XML dosyası bulunuyor:

<wddxPacket version='1.0'>
    <header/>
    <data>
        <struct>
            <var name='infocodes'>
                <string>Tag1,Tag2,Tag3</string>
            </var>
        </struct>
    </data>
</wddxPacket>

3 Cevap

Basit hata: $tags .= yerine döngü içinde $tags = kullanımı:

$tags = '';
for ($i = 0; $i <count($rawtags); $i++){
    $tags .= '<tag value="' . $rawtags[$i] . '" />';
}
for ($i = 0; $i <count($rawtags); $i++){
    $tags = '<tag value="' . $rawtags[$i] . '" />';
}

Sadece her yineleme $tags değişkeni üzerine yazıyorsanız. Deneyin:

$tags = '';
foreach ($rawtags as $rawtag) {
    $tags .= '<tag value="' . $rawtag . '" />';
}

Eğer (aksi takdirde bir PHP uyarısı oluşturur) $tags buna ekleme önce başlatılması gerektiğini unutmayın.

Ayrıca, foreach yerine for döngü kullanarak kod daha basit ve okunabilir hale getirir. Bu gibi önemsiz hatalar onlar gürültü ile çevrili değilken spot kolaydır.

$tags .= '<tag value="' . $rawtags[$i] . '" />';

Bu sorununuzu çözebilir.