我如何按嵌套的php数组排序

时间:2011-10-13 20:51:47

标签: php sorting html-table

这是摘自the xml feed I'm accessing

xml feed

这是我目前的代码:

$file = file_get_contents('feed.xml');
$file = preg_replace('/(<role[^>]+>)([^<]+)/si', '$1', $file);
$xml = new SimpleXMLElement($file);

$search_term = preg_replace('/[,.\/\\\(\)\[\]\{\}`~!@#\$%\^&*;:\'"\-_<>]*/is', '', $_GET['work']);

$productions = $xml->xpath('//production');
?>

<table width="300px" cellspacing="5px" cellpadding="5px" border="1px" >
<tr>
<th>year</th>
<th>company</th>
</tr>

<?php
foreach($productions as $prod) {

    $prod_attrs = $prod->attributes();
    $prod_date = $prod_attrs->startdate;

    echo "<tr><td>", $prod_date, "</td><td>", html_encode($prod_attrs->company), "</td></tr>";


    }               
?>

</table>

这是输出: table

我的问题是,如何让表格按降序排序(即最近一年的第一年)?我在这里搜索并尝试了解sort()函数(例如this answer),但它仍然有点超出我的范围,我无法弄清楚如何让它在这里工作。


更新

我正在玩@ Chris Goddard's answer below ..

这是我已经获得的代码,但它似乎没有完成这个诀窍:

<?php


    function html_encode($var){

    $var = html_entity_decode($var, ENT_QUOTES, 'UTF-8');
    $var = htmlentities($var, ENT_QUOTES, 'UTF-8');
    return $var;
}


$file = file_get_contents('feed.xml');
$file = preg_replace('/(<role[^>]+>)([^<]+)/si', '$1', $file);
$xml = simplexml_load_string($file);
$json = json_encode($xml); 
$array = json_decode($json,TRUE); 


$search_term = preg_replace('/[,.\/\\\(\)\[\]\{\}`~!@#\$%\^&*;:\'"\-_<>]*/is', '', $_GET['work']);


$works = $xml->xpath('//work');

foreach($works as $work) {
$Productions = $work->xpath('./production');

$Sorter = array();

foreach ($Productions as $prod) {

$prod_attrs = $prod->attributes();
    $Sorter[$key] = $prod_attrs->startdate;
array_multisort($Sorter, SORT_DESC, $Productions);
  }
}
echo "<pre>".print_r($works, true)."</pre>";
?>

我做错了什么?

3 个答案:

答案 0 :(得分:1)

array_multisort可以解决这个问题

你把一个数组放在第一个(有每个元素的键,排序值,方向然后是大数组)

修改

$Productions = json_decode(json_encode((array) simplexml_load_string($file)), 1);
$Sorter = array();

foreach ($Productions as $Key => $prod)
    $Sorter[$Key] = $prod->attributes->startdate;
array_multisort($Sorter, SORT_DESC, $Productions);

foreach ($Productions as $prod) { ...

答案 1 :(得分:1)

您可以将值放在数组中,然后使用usort按用户定义的函数进行排序。

请注意,元素在数组中设置时会转换为字符串。将它们作为XML对象进行比较并不是您想要的。

一点解释:

首先,我将XML数据放入数组中,因为数据更容易以这种方式工作。

然后,我根据自定义函数date_sort对数组进行排序。查看以下文档:

  

比较函数必须返回小于,等于或的整数   如果第一个参数被认为是大于零   分别小于,等于或大于第二个。

所以,因为你想按日期desc排序,如果日期相等,那么排序顺序也是相等的(返回0),如果日期稍晚,它应该在列表的前面(返回-1),并且如果日期更大,它应该在列表的后面(返回1)

然后,您只需遍历阵列打印即可。

如果要使用其他数据,只需将其放在第一个循环中的数组中即可。

$production_array = array();
foreach($productions as $prod) {

    $prod_attrs = $prod->attributes();
    $prod_date = $prod_attrs->startdate;
    $production_array[] = array(
        'date'=>(string) $prod_date,
        'company'=>(string) $prod_attrs->company,
        'review_en'=>(string) $prod->review['quote'],
        'review_de'=>(string) $prod->review->translation
    );
}
usort($production_array, 'date_sort');

foreach($production_array as $production) {
    echo "<tr><td>", $production['date'], "</td><td>", html_encode($production['company']), "</td><td>",$production['review_en'], "</td></tr>";
}

function date_sort($a, $b) {
    if($a['date'] == $b['date']) return 0;
    return $a['date'] > $b['date'] ? -1 : 1;
}

答案 2 :(得分:1)

我不明白一半的代码(什么是正则表达式?),但要实现所需的排序表,你可以简单地做:

$profile = simplexml_load_file('http://andrewfinden.com/test/feed.xml');
$productions = $profile->xpath(
    '/profile/repertoire/composer/work/role/production'
);

加载XML并获取XML中出现的所有产品的列表。要对它们进行排序,您可以使用自定义排序:

usort($productions, function($a, $b) {
    return $b['startdate'] - $a['startdate'];
});

将比较simplexml元素的开始日期并按降序排序。然后它只是迭代产品的问题:

<table>
    <thead>
        <tr>
            <th>Year</th>
            <th>Company</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($productions as $production): ?>
        <tr>
            <td><?php echo htmlspecialchars($production['startdate'])?></td>
            <td><?php echo htmlspecialchars($production['company'])?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>

See demo

另请参阅demo for your additional requests中的此chat,例如将制作限制为那些通过生产开始日期进行审查和分类的人。