0

たとえば、私は配列を持っています

Array ( [0] => car [1] => bmw [2] => colour [3] => red [4] => quality [5] => good)

配列をxmlにコピーするクラスもあります。

このように配列をxmlにコピーします

<root>
<0>car</0>
<1>bmw</1>
<2>colour</2>
<3>red</3>
<4>quality</4>
<5>good</5>
</root>

このように配列をxmlにコピーする必要があります

<root>
<car>bmw</car>
<colour>red</colour>
<quality>good</quality> 
</root>

私のクラス

class Array2XML {

    private $writer;
    private $version = '1.0';
    private $encoding = 'UTF-8';
    private $rootName = 'root';


    function __construct() {
        $this->writer = new XMLWriter();
    }

    public function convert($data) {
        $this->writer->openMemory();
        $this->writer->startDocument($this->version, $this->encoding);
        $this->writer->startElement($this->rootName);
        if (is_array($data)) {
            $this->getXML($data);
        }
        $this->writer->endElement();
        return $this->writer->outputMemory();
    }
    public function setVersion($version) {
        $this->version = $version;
    }
    public function setEncoding($encoding) {
        $this->encoding = $encoding;
    }
    public function setRootName($rootName) {
        $this->rootName = $rootName;
    }
    private function getXML($data) {
        foreach ($data as $key => $val) {
            if (is_numeric($key)) {
                $key = 'key'.$key;
            }
            if (is_array($val)) {
                $this->writer->startElement($key);
                $this->getXML($val);
                $this->writer->endElement();
            }
            else {
                $this->writer->writeElement($key, $val);
            }
        }
    }
}
4

2 に答える 2

0

convert($data)メソッドで、次の部分を変更します。

if (is_array($data)) {
    $this->getXML($data);
}

に:

if(is_array($data))
{
    if(count($data)%2===0)
    {
        $cache=array();
        while(count($data)>0)
        {
            list($key,$val)=array_splice($data,0,2);
            $cache[$key]=$val;
        }
        print_r($cache);//just to debug
        $this->getXML($cache);
    }
    else
    {
        $this->getXML($data);
    }
}

私はあなたのクラス全体をテストしませんでしたが、操作部分については、テストしました:

$data=array("car","bmw","colour","red","quality","good");
if(count($data)%2===0)
/* ...... */
print_r($cache);

上記のコードは次のように出力します。

Array
(
    [car] => bmw
    [colour] => red
    [quality] => good
)
于 2013-02-18T03:39:40.180 に答える
0

追加する要素の名前と値を取得するには、2 つの値をそれぞれペアにする必要があります。array_chunkたとえば、次のようにします。

$data  = Array(0 => 'car', 1 => 'bmw', 2 => 'colour', 3 => 'red', 4 => 'quality', 5 => 'good');
$count = count($data);
if ($count % 2) {
    throw new InvalidArgumentException('Array not of pairs.');
}

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument();
$xml->startElement('root');

foreach (array_chunk($data, 2) as $pair) {
    list($name, $value) = $pair;
    $xml->writeElement($name, $value);
}

$xml->endElement();
echo $xml->outputMemory();

とにかくメモリを使用しているので、代わりに SimpleXML を使用してこれを行うこともできます。

$data  = Array(0 => 'car', 1 => 'bmw', 2 => 'colour', 3 => 'red', 4 => 'quality', 5 => 'good');
$count = count($data);
if ($count % 2) {
    throw new InvalidArgumentException('Array not of pairs.');
}

$xml = new SimpleXMLElement('<root/>');

foreach (array_chunk($data, 2) as $pair) {
    list($name, $value) = $pair;
    $xml->{$name}[] = $value;
}

echo $xml->asXML(), "\n";
于 2013-02-18T08:49:30.310 に答える