Avatar billede kodak Mester
02. december 2009 - 18:55 Der er 15 kommentarer og
1 løsning

Mappe struktur

Jeg har følhendene kode som jeg gerne vil have modifiseret lidt:

Når den henter info fra en xml fil
fil.php

<?php
$rdr = new XMLReader();
$rdr->xmL(file_get_contents('smu/udvalg.xml'));

$n = 0;
while($rdr->read()){
switch ($rdr->nodeType) {
case XMLReader::TEXT:
$s = $rdr->value;
break;
case XMLReader::ELEMENT:
if($rdr->localName == 'top') {
$no = $rdr->getAttribute('no');
}
break;
case XMLReader::END_ELEMENT:
if($rdr->localName == 'navn') {
$navn = $s;
} else if($rdr->localName == 'button') {
$button = $s;
} else if($rdr->localName == 'adresse') {
$adresse = $s;
} else if($rdr->localName == 'kontakt') {
$kontakt = $s;
} else if($rdr->localName == 'top') {
if ($n==5) continue; //Hvormange der må vises.
echo "<td>\r\n";
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo "<table>
<tr>
        <td><a href=\"?main=udvalg.&udvalg=" . $adresse . "\"><img src=\"images/" . $button . ".png\" width=\"60\" height=\"60\" alt=\"" . $navn . "\" border=\"0\" align=\"absmiddle\"></a><a href=\"?main=udvalg.&udvalg=" . $adresse . "\"><center><p class=\"ungdom01\">" . $navn . "</a></p></center></td>
</tr>";
$n++;
echo "</td>\r\n";
}
break;
}
}
?>


Den viser de 5 første hvis der er flere skal den vise de næste på linje nedenunder og det skal den fortsætte med hvis der er flere.
Avatar billede groyk Novice
02. december 2009 - 19:49 #1
vil det sige at du vil have samme funktion som du har i dag, bare omskrevet? Eller forstår jeg ikke spørgsmålet?

mvh
Simon
Avatar billede kodak Mester
02. december 2009 - 20:17 #2
Stort set ja

Men den jeg har nu vil ikke fortsætte på næste linie.
Avatar billede repox Seniormester
02. december 2009 - 22:59 #3
Avatar billede groyk Novice
03. december 2009 - 07:26 #4
Kan du evt. smide et eksempel på xml filen?
Avatar billede groyk Novice
03. december 2009 - 07:27 #5
repox Hvorfor poster du dette link?
Avatar billede repox Seniormester
03. december 2009 - 08:45 #6
#5
Det tror jeg nu godt du kan regne ud - men fred være med det; fortsæt bare med hvad du nu havde gang i...
Avatar billede groyk Novice
03. december 2009 - 09:12 #7
Hej Repox

Hvis du havde mistanke om at jeg ville kræve betaling for et svar er du helt forkert på den. Hvis du ellers vil tage dig den ulejlighed at læse mine tidligere poster igennem, så tror jeg ikke du kan finde sådanne eksempler.

Grunden til at jeg stillede spørgsmålet, er faktisk at jeg gerne vil se om jeg kan hjælpe, dog har jeg ikke selv rodet meget med XML hvilket også er derfor jeg spørger til et XML eksempel.

Er ret sikker på at problemet er let løst, med samtidigt hjælper det mig til at se / afprøve en simpel XML reader.
Avatar billede repox Seniormester
03. december 2009 - 09:27 #8
#7

Jeg kan se du missede pointen fuldstændig i det jeg sendte; men som sagt - fortsæt bare; linket har absolut ikke noget med dig at gøre, bare rolig - beklager hvis jeg fik det vil at virke sådan.
Avatar billede groyk Novice
03. december 2009 - 09:31 #9
OK, og lige over

Spørger måske dumt, men hvad var pointen :-)
Avatar billede repox Seniormester
03. december 2009 - 09:50 #10
#9
Den bliver ganske pænt penslet ud her:
http://www.eksperten.dk/spm/886117#reply_7494646
Avatar billede kodak Mester
03. december 2009 - 12:29 #11
Xml files ser så ledes ud:

<?xml version='1.0' standalone='yes'?>
<menuer>
    <top no="1">
        <navn>mappe 1</navn>
        <button>auto</button>
        <adresse>auto</adresse>
    </top>
    <top no="2">
        <navn>It</navn>
        <button>it</button>
        <adresse>it</adresse>
    </top>
</menuer>
Avatar billede groyk Novice
03. december 2009 - 14:50 #12
Hej kodak

Lavede lige en kort søgning på google efter xml2array og faldt over denne funktion


<?php
/**
* xml2array() will convert the given XML text to an array in the XML structure.
* Link: http://www.bin-co.com/php/scripts/xml2array/
* Arguments : $contents - The XML text
*                $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value.
*                $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance.
* Return: The parsed XML in an array form. Use print_r() to see the resulting array structure.
* Examples: $array =  xml2array(file_get_contents('feed.xml'));
*              $array =  xml2array(file_get_contents('feed.xml', 1, 'attribute'));
*/
function xml2array($contents, $get_attributes=1, $priority = 'tag') {
    if(!$contents) return array();

    if(!function_exists('xml_parser_create')) {
        //print "'xml_parser_create()' function not found!";
        return array();
    }

    //Get the XML parser of PHP - PHP must have this module for the parser to work
    $parser = xml_parser_create('');
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); # http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);

    if(!$xml_values) return;//Hmm...

    //Initializations
    $xml_array = array();
    $parents = array();
    $opened_tags = array();
    $arr = array();

    $current = &$xml_array; //Refference

    //Go through the tags.
    $repeated_tag_index = array();//Multiple tags with same name will be turned into an array
    foreach($xml_values as $data) {
        unset($attributes,$value);//Remove existing values, or there will be trouble

        //This command will extract these variables into the foreach scope
        // tag(string), type(string), level(int), attributes(array).
        extract($data);//We could use the array by itself, but this cooler.

        $result = array();
        $attributes_data = array();
       
        if(isset($value)) {
            if($priority == 'tag') $result = $value;
            else $result['value'] = $value; //Put the value in a assoc array if we are in the 'Attribute' mode
        }

        //Set the attributes too.
        if(isset($attributes) and $get_attributes) {
            foreach($attributes as $attr => $val) {
                if($priority == 'tag') $attributes_data[$attr] = $val;
                else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
            }
        }

        //See tag status and do the needed.
        if($type == "open") {//The starting of the tag '<tag>'
            $parent[$level-1] = &$current;
            if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag
                $current[$tag] = $result;
                if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
                $repeated_tag_index[$tag.'_'.$level] = 1;

                $current = &$current[$tag];

            } else { //There was another element with the same tag name

                if(isset($current[$tag][0])) {//If there is a 0th element it is already an array
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
                    $repeated_tag_index[$tag.'_'.$level]++;
                } else {//This section will make the value an array if multiple tags with the same name appear together
                    $current[$tag] = array($current[$tag],$result);//This will combine the existing item and the new item together to make an array
                    $repeated_tag_index[$tag.'_'.$level] = 2;
                   
                    if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well
                        $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                        unset($current[$tag.'_attr']);
                    }

                }
                $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
                $current = &$current[$tag][$last_item_index];
            }

        } elseif($type == "complete") { //Tags that ends in 1 line '<tag />'
            //See if the key is already taken.
            if(!isset($current[$tag])) { //New Key
                $current[$tag] = $result;
                $repeated_tag_index[$tag.'_'.$level] = 1;
                if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data;

            } else { //If taken, put all things inside a list(array)
                if(isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array...

                    // ...push the new element into that array.
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
                   
                    if($priority == 'tag' and $get_attributes and $attributes_data) {
                        $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag.'_'.$level]++;

                } else { //If it is not an array...
                    $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value
                    $repeated_tag_index[$tag.'_'.$level] = 1;
                    if($priority == 'tag' and $get_attributes) {
                        if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well
                           
                            $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                            unset($current[$tag.'_attr']);
                        }
                       
                        if($attributes_data) {
                            $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken
                }
            }

        } elseif($type == 'close') { //End of tag '</tag>'
            $current = &$parent[$level-1];
        }
    }
   
    return($xml_array);



Hvis du bruger denne funktion kan du omforme et XML dokument til et array i PHP. Herefter er det jo bare at outputte data som du ønsker det.

Herunder eksempel på din fil (har bare lavet en print_r() for at vise indholdet at arrayet)


<?php
include('xml2array.php');

$array =  xml2array(file_get_contents('exp.xml'),0);

print_r($array);
?>
Avatar billede groyk Novice
03. december 2009 - 14:51 #13
Alternativt kan funktionen hentes her

http://www.bin-co.com/php/scripts/xml2array/
Avatar billede kodak Mester
03. december 2009 - 15:32 #14
Det var da ellers noget af en kode den kan jeg jo ikke engang finde rundt i.

Jeg har jo scriptetder henter det jeg skal bruge.
Den skal bare ændres så den sætter det op som i en mappe

Eksempel på visning:

I dette eksempel er der 13 xml "top" kategorier

  ________    ________    ________    ________    ________
|Billede|  |Billede|  |Billede|  |Billede|  |Billede|
|  0  |  |  1  |  |  2  |  |  3  |  |  4  |
|_______|  |_______|  |_______|  |_______|  |_______|
  Navn0      Navn1      Navn2      Navn3      Navn4

  ________    ________    ________    ________    ________
|Billede|  |Billede|  |Billede|  |Billede|  |Billede|
|  5  |  |  6  |  |  7  |  |  8  |  |  9  |
|_______|  |_______|  |_______|  |_______|  |_______|
  Navn5      Navn6      Navn7      Navn8      Navn9

  ________    ________    ________
|Billede|  |Billede|  |Billede|
|  10  |  |  11  |  |  12  |
|_______|  |_______|  |_______|
  Navn10      Navn11      Navn12




Der skal max kunne være 5 i hver linie
Od da der er 13 her er der 3 linier.

Jeg har kun fået den bygget til en linie.
Men jeg skulle gerne have "if ($n==5) continue;" nulstillet så den kan fortsætte med at tælle i næste linie det ernoget i den dur jeg har forstillet mig.
Avatar billede kodak Mester
05. december 2009 - 16:24 #15
Fandt en løsning

i stedet for at nulstille eller overhoved bruge tælle funktionen, benyttede jeg mig afdenne

if ($no==1) {
echo "tekst";
}
Som gør at den kun kan vise den der har nummer 1
kunne osdå have været:
if ($name==ole) {
echo "tekst";
}
Hvis den kun måtte vise dem der hed ole.
Avatar billede kodak Mester
05. december 2009 - 16:26 #16
Men takker for Hjælpen aligevel,
Du gjorde i det mindste en indsats.
Takker.
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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