[英]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.