PHP基于另一个用户定义的数组

时间:2015-05-16 10:56:16

标签: php arrays sorting multidimensional-array user-defined

希望我没有打开一个重复的问题,但我没有看到这类问题被问到或者我看到的答案似乎与我的数据集无关(但我对此很新)。

我希望根据另一个字符串数组对以下数据集(数组数组)进行排序。

代码正在运行,它只运行了$ ntbooks数组中存在的字符串的generateHtml函数,这是设计的。 我需要解决的是如何使用$ ntbooks作为订单执行自定义排序。现在,当代码运行并且内容从content.php解析时,数据填充到菜单中的顺序是它看到的顺序(数组的顶部到底部) - 我想对数据进行排序所以马修写出来,马克,然后是卢克等等。

这是我的数据样本,但其中有超过250个数组(contentids),我想避免重组或重新组织我的数据集。完成所有操作后,generateHTML应该以matthew,mark,luke开头,并在列表中工作。

提前感谢您的帮助!

动态生成的HTML菜单(menu.php):

                    include('content.php');

                    $main = array();

                    foreach($articles as $article)
                    {
                        foreach(explode("; ", $article["verse"]) as $verseData)
                        {

                            $verse = explode(" ", $verseData);

                            $book = $verse[0];
                            $verse = explode(":", $verse[1]);
                            $chapter = $verse[0];

                            if(empty($main[$book]))
                                $main[$book] = array();

                            if(empty($main[$book][$chapter]))
                                $main[$book][$chapter] = array();

                            if(empty($main[$book][$chapter][$verse[1]]))
                                $main[$book][$chapter][$verse[1]] = array();

                            $main[$book][$chapter][$verse[1]] = array
                            (
                                "full" => $article["full"]
                            );
                        }
                    }                       

                    $ntbooks = array("Matthew", "Mark", "Luke", "John", "Acts", "Romans", "1Corinthians", "2Corinthians", "Galatians", "Ephesians", "Philippians", "Colossians", "1Thessalonians", "2Thessalonians", "1Timothy", "2Timothy", "Titus", "Philemon", "Hebrews", "James", "1Peter", "2Peter", "1John", "2John", "3John", "Jude", "Revelation");


                    foreach($main as $book => $data)
                    {

                        if (in_array($book, $ntbooks)) {

                            generateHtml($book, $data);

                        }

                    }

                    function generateHtml($book, $data)
                    {
                        echo "<!-- ". $book ." -->\n";
                        echo "<div class=\"submenu\">\n";
                        echo "<a href=\"#\">". $book ."</a>\n";
                        echo "<!-- Level 2 menu -->\n";
                        echo "<div>\n";
                        echo "<div>\n";

                        foreach($data as $chapter => $verses)
                        {
                            echo "<div class=\"submenu\">\n";
                            echo "<a href=\"#\"">Chapter ". $chapter ."</a>\n";
                            echo "<!-- Level 3 menu -->\n";
                            echo "<div>\n";
                            echo "<div>\n";

                            foreach($verses as $verse => $value)
                            {
                                echo "<a href=\"#\"">Verse ". $verse ."</a>\n";
                            }

                            echo "</div>\n";
                            echo "</div>\n";
                            echo "</div>\n";

                        }


                    }

PHP数组数组(content.php):

$articles = array(

          array(
          'contentid' => '0',
          'full' => 'Item1 by Artist Name1 (Matthew 4)',
          'verse' => 'Matthew 4:18-22',
          'commentary' => ''),

          array(
          'contentid' => '1',
          'full' => 'Item2 by Artist Name2 (Luke 15)',
          'verse' => 'Luke 15:11-14; Luke 15:20-21',
          'commentary' => ''),           

          array(
          'contentid' => '2',
          'full' => 'Item3 by Artist Name3 (John 3)',
          'verse' => 'John 3:1-9',
                      'commentary' => ''),    

          array(
          'contentid' => '3',
          'full' => 'Item4 by Artist Name4 (John 8)',
          'verse' => 'John 8:1-15A',
          'commentary' => ''),

          array(
          'contentid' => '4',
          'full' => 'Item5 by Artist Name5 (Matthew 27; Luke 23; John 19)',
          'verse' => 'Matthew 27:20-23A; Luke 23:20-25A; John 19:2-3A',
          'commentary' => 'Here '));

2 个答案:

答案 0 :(得分:0)

使用usort

来自:http://php.net/manual/en/function.usort.php

bool usort ( array &$array , callable $value_compare_func )

基本上,您使用要排序的数组调用usort,并使用一个指示排序顺序的函数(比较两个对象并确定哪个是&#34;更大&#34;)。

由于这本书在诗歌对象中,你可以这样做:

function sortCompare($obj1, $obj2) { $book1 = explode($obj1['verse'])[0]; $book2 = explode($obj2['verse'])[0]; return indexOf($book1, $ntbooks) - indexOf($book2, $ntbooks); }

此时你可以打电话 usort($articles, "sortCompare");

上面的sortCompare功能可能需要调整,但这是一个良好的开端。

答案 1 :(得分:0)

您需要使用自定义比较函数进行排序,其中要比较的值将是参考数组中与数据数组中的值对应的键。

所以如果:

$order = ['Matthew', 'Mark', 'Luke'];

并且您的数据阵列verse保证是上述值之一(在您的示例中,这是 true!)然后您可以使用

$comparison = function($a, $b) use ($order) {
    return array_search($a['verse'], $order) - array_search($b['verse'], $order);
};

usort($data, $comparison);

但是,在你的情况下,它并不那么简单,因为verse不那么方便。你需要以某种方式从中提取感兴趣的值,这是一个我不会试图解决的练习,因为有太多的未知数(例如'Matthew 27:20-23A; Luke 23:20-25A; John 19:2-3A'应该如何排序?)。