繁体   English   中英

PHP根据另一个用户定义的数组对数组进行排序

[英]PHP Sorting array of arrays based on another user-defined array

希望我没有打开一个重复的问题,但是我没有看到这种问题,或者我看到的答案似乎不适用于我的数据集(但是我对此很陌生)。

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

该代码正在运行,并且仅针对$ ntbooks数组中存在的字符串(根据设计)运行了generateHtml函数。 我需要解决的是如何使用$ ntbooks作为顺序执行自定义排序。 现在,当代码运行并且从content.php解析内容时,将数据填充到菜单中的顺序是显示顺序(数组的顶部到底部),我想对数据进行排序这样就写出了Matthew,然后是Mark,然后是Luke,依此类推。

这是我的数据样本,但是其中有250个以上的数组(内容ID),我想避免重组或重组数据集。 说完所有内容后,generateHTML应该以matthew开头,标记,停顿,并逐步处理列表。

预先感谢您的帮助!

动态生成的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 '));

使用usort

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

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

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

由于这本书在诗句中,因此您可以执行以下操作:

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函数可能需要调整,但这是一个好的开始。

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

因此,如果:

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

并且您的数据数组的verse保证为上述值之一(在您的示例中,这是正确的!),则可以使用

$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'应该排序?)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM