Jak vnořit pole do jednoho – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak vnořit pole do jednoho – PHP – Fórum – Programujte.comJak vnořit pole do jednoho – PHP – Fórum – Programujte.com

 

kiCkZ0
Newbie
22. 11. 2017   #1
-
0
-

Zdravim, 

potřeboval bych radu, mam tuto funkci viz níže a potřebuji, aby každé kompletně vygenerované pole se vložilo do jedné položky (zabalit).

Příklad:

Z této funkce se mi zvlášť generuje html, header, text atd.. všechna pole jsou ale samostatná a já bych potřeboval, aby se vždy po vygenerování zabalila do jednoho.

Takže třeba takto:

Item

     - text

     - header

     - html

    - .....

a zase znovu Item a další 

Zde je zdrojový JSON:

http://81.95.108.58/david/5786.json

function getIt($data) {
        $content = [];
        foreach($data->result->data->tab as $tab) {
            if(isset($tab->unified_content->item)) {
                foreach($tab->unified_content->item as $item) {
                    $name = $item->type->name;
                    switch($name) {
                        case "header":
                            $content = array (
                                'title' => $item->text
                            );
                            continue;
                        case "text":
                            $content = array(
                                'description' => $item->text
                            );
                            continue;
                        case "image":
                            $content = array(
                                'image' => getImages($item->image)
                            );
                            continue;
                        case "html":
                            $content = array(
                                'html' => $item->text
                            );
                            break;
                    }
                }
            }
        }
        return $content;
    }
Nahlásit jako SPAM
IP: 94.113.255.–
gna
~ Anonymní uživatel
1875 příspěvků
22. 11. 2017   #2
-
0
-

Asi to nechápu. Toto?

function getIt($data) {
    $content = [];
    foreach($data->result->data->tab as $tab) {
        if(isset($tab->unified_content->item)) {
            foreach($tab->unified_content->item as $item) {
                $name = $item->type->name;
                switch($name) {
                    case "header":
                        $content['title'] = $item->text;
                        break;
                    case "text":
                        $content['description'] = $item->text;
                        break
                    case "image":
                        $content['image'] = getImages($item->image);
                        break;
                    case "html":
                        $content['html'] = $item->text;
                        break;
                }
            }
        }
    }
    return $content;
}
Nahlásit jako SPAM
IP: 213.211.51.–
kiCkZ0
Newbie
22. 11. 2017   #3
-
0
-

#2 gna
Částečně ano tím se vyselectuje každé pole do samostatných podle typu, nicméně výsledek je vždy jako samostatné pole a já bych potřeboval zabalit tyto položky do dalšího "nadřazeného" pole.

Nicméně ještě tu je problém, proč se to propíše jen jednou a ne všechna ta pole.

Array
(
    [image] => Array
        (
            [0] => Array
                (
                    [img] => image.php?id=13310&app_id=5786&key=34d300cde4e36b3f193b93ef18fad7605cbe3a3e
                    [alt] => 
                )

        )

    [title] => Provozní doba Sportbaru
    [description] => 
    [html] => 
Pondělí	16:00 - 22:00
Úterý	16:00 - 22:00
Středa	16:00 - 22:00
Čtvrtek	16:00 - 22:00
Pátek	16:00 - 23:00
Sobota	14:00 - 23:00
Neděle	15:00 - 22:00
 


)
Nahlásit jako SPAM
IP: 94.113.255.–
gna
~ Anonymní uživatel
1875 příspěvků
22. 11. 2017   #4
-
0
-

Hm...

function getIt($data) {
    $content = [];
    foreach($data->result->data->tab as $tab) {
        if(isset($tab->unified_content->item)) {
            $itemdata = [];
            foreach($tab->unified_content->item as $item) {
                $name = $item->type->name;
                switch($name) {
                    case "header":
                        $itemdata['title'] = $item->text;
                        break;
                    case "text":
                        $itemdata['description'] = $item->text;
                        break
                    case "image":
                        $itemdata['image'] = getImages($item->image);
                        break;
                    case "html":
                        $itemdata['html'] = $item->text;
                        break;
                }
            }
            $content[] = $itemdata;
        }
    }
    return $content;
}
Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
4004 příspěvků
22. 11. 2017   #5
-
0
-

Mozna by bylo dobre dat sem treba XML strukturu na vstupu a jaka ma byt na vystupu.
Treba chces 

$c = array()
$c['html'] = array()
(...cyklus...)
{
$c['html'][] = $item->text;
$c['html'][] = $item->text;
$c['html'][] = $item->text;
}
Nahlásit jako SPAM
IP: 2001:718:2601:258:2cc9:31...–
kiCkZ0
Newbie
22. 11. 2017   #6
-
0
-

Já si právě ale vstup beru z json, což jsem už přidával výše: http://81.95.108.58/david/5786.json

Nicméně nyní ta struktura také není ani s tímto scriptem dobrá: http://81.95.108.58/david/xml/5786.xml

Ještě zde uvádim funkci na XML převod, ale mam tam spoustu prázdných polí a ani to neni nakonec rozčleněné tak, aby každý item měl vždy ty položky, snad jsem to popsal dostatečně.

function create_xml($data) {
            // source from JSON
            $array = getIt($data);

            // XML const
            $xml = '<?xml version="1.0" encoding="UTF-8"?>';
            $xml .= '<rss version="2.0" >' . "\n";

            // channel required properties
            $xml .= '<channel>' . "\n";
            // $xml .= '<title>' . . '</title>' . "\n";
            // $xml .= '<link>' . . '</link>' . "\n";
            // $xml .= '<description>' . . '</description>' . "\n";

        foreach($array as $rss_item) {
            $xml .= '<item>' . "\n";
  //             $xml .= '<id>' . $rss_item['id'] . '</id>' . "\n";
            $xml .= '<title>' . $rss_item['title'] . '</title>' . "\n";
            $xml .= '<description><![CDATA[' . $rss_item['description'] . ']]></description>' . "\n";
            $xml .= '<html><![CDATA[' . $rss_item['html'] .']]></html>'. "\n";
            $xml .= '<image>' . $rss_item['image'] .'</image>'. "\n";
            $xml .= '<button>' . $rss_item['button'] .'</button>'. "\n";
            $xml .= '</item>' . "\n";
            }
        $xml .= '</channel>';
        $xml .= '</rss>';

        return $xml;
    }

    $xml = new SimpleXMLElement(create_xml($data));
    $xml->asXML('xml/'.$app_id.'.xml');

    if($xml) {
        echo "XML soubor byl úspěšně vytvořen"; 
    } else {
        echo "Nastal problém s vytvořením XML souboru";
    }

Nahlásit jako SPAM
IP: 94.113.255.–
Kit+15
Guru
22. 11. 2017   #7
-
+2
-
Zajímavé
Row +

#6 kiCkZ
To vypadá, jako kdybys chtěl JSON převést nikoli na obecné XML, ale na RSS. Uvedeným postupem ovšem téměř vždy vyleze nevalidní dokument, který ti žádá RSS čtečka nesežere.

Třída SimpleXMLElement se používá spíš pro čtení XML než pro generování. Mnohem lepší je třída XMLWriter, ale jako nejlepší se mi jeví třída DOMDocument, viz http://php.net/manual/en/book.dom.php

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4004 příspěvků
23. 11. 2017   #8
-
0
-

Jj, ten json tam je, ale nebylo jasne, vysvetleno, k cemu patri. Treba se bude dat pouzit neco z googlu. Mimochodem, mas tam htmlspecialchars? Json se zpetne dekoduje na data a treba na serverech jako zbozi.cz jsou na to citlivy, kdyz je tan znak & < >.

google = php convert json to xml

function array2xml($array, $xml = false){

    if($xml === false){
        $xml = new SimpleXMLElement('<result/>');
    }

    foreach($array as $key => $value){
        if(is_array($value)){
            array2xml($value, $xml->addChild($key));
        } else {
            $xml->addChild($key, $value);
        }
    }

    return $xml->asXML();
}

$raw_data = file_get_contents('http://pastebin.com/raw.php?i=pN3QwSHU');
$jSON = json_decode($raw_data, true);

$xml = array2xml($jSON, false);

echo '<pre>';
print_r($xml);

--- 

    protected function display($result) {
        if (empty($this->output_type) || strtolower($this->output_type) == "json") {
            header('Content-type: application/json');
            echo json_encode($result);
        } else if (strtolower($this->output_type) == "xml") {
            header('Content-type: application/xml');
            echo '<?xml version="1.0"?>';
            echo "<result>";
            $xml_array = json_decode(json_encode($result), true);
            $this->xmlWalker($xml_array, "start");
            echo "</result>";
        } else { //catch all why not
            header('Content-type: application/json');
            echo json_encode($result);
        }
    }

    protected function xmlWalker($xml_array, $parent) {
         foreach($xml_array as $tag => $value) {
            if ((int)$tag === $tag) {
                $tag = mb_substr($parent, 0, -1);
            }
            echo "<" .$tag. ">";
            if (is_array($value)) {
                $this->xmlWalker($value, $tag);
            } else {
                echo $value;
            }
            echo "</" .$tag. ">";
        }
    }

--- 

$xml = new SimpleXMLElement('<root/>');
$arr = json_decode($your_array, true);
array_walk_recursive($arr, array ($xml,'addChild'));

--- 

$xml = new SimpleXMLElement('<root/>');
$this->arrayToXml($array, $xml);

function arrayToXml($array, &$xml){
    foreach ($array as $key => $value) {
        if(is_array($value)){
            if(is_int($key)){
                $key = "e";
            }
            $label = $xml->addChild($key);
            $this->arrayToXml($value, $label);
        }
        else {
            $xml->addChild($key, $value);
        }
    }
}

---
https://gist.github.com/…ngue/4982951 (new DomDocument)
http://php.net/…implexml.php

<?php
function array2XML($arr,$root) {
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><{$root}></{$root}>");
$f = create_function('$f,$c,$a','
        foreach($a as $v) {
            if(isset($v["@text"])) {
                $ch = $c->addChild($v["@tag"],$v["@text"]);
            } else {
                $ch = $c->addChild($v["@tag"]);
                if(isset($v["@items"])) {
                    $f($f,$ch,$v["@items"]);
                }
            }
            if(isset($v["@attr"])) {
                foreach($v["@attr"] as $attr => $val) {
                    $ch->addAttribute($attr,$val);
                }
            }
        }');
$f($f,$xml,$arr);
return $xml->asXML();
}
?>

--- 

// tady by se asi pouzil prevod z array $array = json_decode($json,TRUE);
<?php
function assocArrayToXML($root_element_name,$ar)
{
    $xml = new SimpleXMLElement("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>");
    $f = create_function('$f,$c,$a','
            foreach($a as $k=>$v) {
                if(is_array($v)) {
                    $ch=$c->addChild($k);
                    $f($f,$ch,$v);
                } else {
                    $c->addChild($k,$v);
                }
            }');
    $f($f,$xml,$ar);
    return $xml->asXML();
}
?>
Nahlásit jako SPAM
IP: 2001:718:2601:258:b01b:ab...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý