xml到数组然后排序和显示

时间:2014-09-15 07:16:02

标签: php arrays xml sorting

我有以下xml文件(示例)

<xml>
 <product>
  <url>banners</url>
  <name>Banners</name>
 </product>
 <product>
  <url>billboards</url>
  <name>Billboards</name>
 </product>
 <product>
  <url>brochures</url>
  <name>Brochures</name>
 </product>
 <product>
  <url>business-cards</url>
  <name>Business Cards</name>
 </product>
</xml>

我想编写一个PHP脚本,在解析xml文件时(不时改变而不会手动排序)按标记的字母顺序对值进行排序,但是我找到的代码用于转换我的xml文件数组也会在数组中放入大量无用的信息,因此几乎不可能对我想要显示的信息进行排序和显示。这是我到目前为止的PHP代码

<?php

$file = file_get_contents("xml/products.xml");
$p = xml_parser_create();
xml_parse_into_struct($p, $file, $vals, $index);
xml_parser_free($p);

asort($vals['value']);

echo "<H1>Vals array</H1><BR>";
print_r($vals);
?>

还有另一种方法可以转换我的xml文件而不需要所有不必要的信息,这样我就能轻松地显示信息吗?

我希望最终得到的数组看起来像

Array
(
    [product] => Array
        (
            [url] => window-clings
            [name] => Window Clings
        )
    [product] => Array
        (
            [url] => banners
            [name] => Banners
        )
)

3 个答案:

答案 0 :(得分:1)

这可能就是你想要的了

function cmp($a, $b)
{
    return strcmp($a["name"], $b["name"]); // sort by name field 
}

$xml = simplexml_load_string($xmlString, null, LIBXML_NOCDATA);
if($xml == false){
    // Handle error
}


$json = json_encode($xml);
$array = json_decode($json, TRUE);

usort($array['product'], "cmp");

print_r($array);

// Iterate over your array
foreach ($array['product'] as $key => $value) {
    echo $value['name']. ' : '. $value['url'];
}

你的数组看起来像这样

Array
(
    [product] => Array
        (
            [0] => Array
                (
                    [url] => banners
                    [name] => Banners
                )

            [1] => Array
                (
                    [url] => billboards
                    [name] => Billboards
                )

            [2] => Array
                (
                    [url] => brochures
                    [name] => Brochures
                )

            [3] => Array
                (
                    [url] => business-cards
                    [name] => Business Cards
                )

        )

)

答案 1 :(得分:1)

如果你想以降序排序。在这种情况下你可以使用usort()。例如:

$xml = simplexml_load_file('xml/products.xml');
$data = json_decode(json_encode($xml), true);
usort($data['product'], function($a, $b){
    return strcmp($b['name'], $a['name']);
});
$final = array_map(function($batch){
    return array('product' => $batch);
}, $data['product']);
echo '<pre>';
print_r($final);

答案 2 :(得分:0)

经过几个小时的实验后,我想出了这个解决方案,它给出了我想要的结果,并允许我相应地操作结果

$file = simplexml_load_file("xml/products.xml");

foreach($file->product as $product)
{
 $products["$product->name"] = "$product->url";
}

asort($products);
foreach($products as $name => $url)
{
 echo"       <A HREF=\"products/$url.php\">$name</A>";
}