我有两个来自外部网站的JSON数组。我先对这两个数组进行排序和合并,再解码并按ID从高到低排序。 目前,当单击“按字母顺序排序”选项时,在URL末尾添加?sort=alphabetical,页面加载完成后,JSON数组再次被解码并合并。 这不是我想要的结果:当单击该选项时,我不希望JSON数组再次被解码并合并 - 我只想要已经解码并合并的JSON数组按字母顺序排序。 数组:$homepage = array(); $homepage[]= '{ "info":{ "collection":[ { "Name":"Charlie", "ID":"7" }, { "Name":"Emma", "ID":"9" } ] } }'; $homepage[] = '{ "info":{ "collection":[ { "Name":"Bob", "ID":"5" } ] } }'; 排序:$data = array(); foreach ($homepage as $homepage2) { $tmp=json_decode($homepage2, false); $data = array_merge($data,$tmp->info->collection); } if(!empty($_GET['sort']) && $_GET['sort'] == 'alphabetical') { usort($data, function ($a, $b) { return strcmp($a->Name, $b->Name); }); }else{ usort($data, function ($a, $b) { return $b->ID - $a->ID; }); } echo' <select onchange="location.href = this.value;"> <option value="example.php?sort=alphabetical">Alphabetical</option> </select> '; foreach($data as $key) { echo' <a href="test.com"> <p>'.$key->ID.'</p> <p>'.$key->Name.'</p> </a> '; }
您可以使用JavaScript来实现点击排序,并仅使用PHP将JSON传递给它。 在提供要显示列表的HTML结构后,我更新了此答案,使用元素作为记录,使用元素作为字段。 我们可以用两个按钮替换选择排序顺序的列表。 这是PHP代码: <?php $homepage = array(); $homepage[]= '{ "info":{ "collection":[ { "Name":"Charlie", "ID":"13" }, { "Name":"Emma", "ID":"9" } ] } }'; $homepage[] = '{ "info":{ "collection":[ { "Name":"Bob", "ID":"10" } ] } }'; $data = array(); foreach ($homepage as $homepage2) { $tmp=json_decode($homepage2, false); $data = array_merge($data,$tmp->info->collection); } ?> <div id="container"></div> <button id="sort1">Alphabetical</button> <button id="sort2">High to Low</button> <script> var collection = <?=json_encode($data)?>; function populate(compareFunc) { collection.sort(compareFunc); var container = document.getElementById('container'); container.innerHTML = ''; collection.forEach(function (key) { var div = document.createElement("div"); div.className = "inventory"; var span = document.createElement("span"); span.textContent = key.ID; div.appendChild(span); span = document.createElement("span"); span.textContent = key.Name; div.appendChild(span); container.appendChild(div); }); } var populateById = populate.bind(null, function (a, b) { return a.ID - b.ID; }); var populateByName = populate.bind(null, function (a, b) { return a.Name.localeCompare(b.Name); }); document.getElementById("sort1").addEventListener('click', populateByName); document.getElementById("sort2").addEventListener('click', populateById); document.addEventListener('DOMContentLoaded', populateById); </script> 对于样本数据,这将导致以下JavaScript/HTML代码,您可以在此处进行测试: var collection = [{"Name":"Charlie","ID":"13"},{"Name":"Emma","ID":"9"},{"Name":"Bob","ID":"10"}]; function populate(compareFunc) { collection.sort(compareFunc); var container = document.getElementById('container'); container.innerHTML = ''; collection.forEach(function (key) { var div = document.createElement("div"); div.className = "inventory"; var span = document.createElement("span"); span.textContent = key.ID; div.appendChild(span); span = document.createElement("span"); span.textContent = key.Name; div.appendChild(span); container.appendChild(div); }); } var populateById = populate.bind(null, function (a, b) { return a.ID - b.ID; }); var populateByName = populate.bind(null, function (a, b) { return a.Name.localeCompare(b.Name); }); document.getElementById("sort1").addEventListener('click', populateByName); document.getElementById("sort2").addEventListener('click', populateById); document.addEventListener('DOMContentLoaded', populateById); span { margin-left: 5px } div.inventory { border-bottom: 1px solid gray } <div id="container"></div> <button id="sort1">Alphabetical</button> <button id="sort2">High to Low</button> 请注意,我将三个项目的ID值与您的问题中的不同,因为否则ID和名称的排序顺序将相同。 使用表:另一种方法 有很多不错的JavaScript库可以更好地表示数据集合。以下是一个使用jQuery和DataTables的示例: var collection = [{"Name":"Charlie","ID":"13"},{"Name":"Emma","ID":"9"},{"Name":"Bob","ID":"5"}]; function populate() { var tbody = $('#collection>tbody'); collection.forEach(function (key) { var row = $('<tr>'); row.append($('<td>').text(key.ID)); row.append($('<td>').text(key.Name)); tbody.append(row); }); } $(document).ready(function(){ populate(); $('#collection').DataTable(); }); <script src="http://code.jquery.com/jquery-1.12.3.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css"> <script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script> <table id="collection"> <thead> <tr><th>ID</th><th>Name</th></tr> </thead> <tbody/> </table> 实际的代码比使用基本表格的纯JavaScript解决方案更小(不计入包含的库)。但是它具有上下排序、过滤、分页、美观的样式等功能。
这个问题有几种解决方案,我将提供一种简单的解决方案: 发送已经排序好的数据作为默认值,如果用户没有做出选择。然后,设置一个函数来根据需要对数据进行排序,并重新绘制表格/ divs/任何您用于呈现它们的内容。 以下是一个快速示例: function sortAlpha(){ for each (stuff in data){ document.getElementById("aTable").textContent=data.StringRepresentation; } } 接着是 sortSize、sortEtc 等函数...在每个函数中,你需要清空一个 div 的内容,然后再次填充它。这样,你就不需要向服务器请求新内容。 getElementById 文档
有多种解决方案可以实现所需的结果。如果您想要使用纯PHP方式,您可以将数据保存在PHP会话中,并根据需要检索它们。 这里的诀窍是,您创建一个函数来获取结果数据,在其中传递单个参数,无论您是要从外部URL获取数据还是从已保存的数据中获取数据。 现在,在您的应用程序中,每当您想要刷新已保存的数据时,请使用参数调用相同的函数,表示要刷新在SESSIONS中保存的数据以替换来自外部源的数据。 使用此方法,您可以重复使用已从外部源获取的数据,而无需每次重新加载函数时重新获取它。 您可以编写另一个函数,该函数将对所有情况返回true,在这些情况下,应用程序必须从外部源重新获取结果集。 我为您编写了伪代码,以便您理解我试图传达的内容, 检查我们是否必须从外部源重新获取结果的函数: function hasToRefreshResult() { if(/* CERTAIN CONDITIONS */) { return true; } return false; } 根据传递的参数,从本地/外部源获取数据的几个函数: function getResultArray($getdatafromlocal) { if(!hasToRefreshResult() && $getdatafromlocal && array_key_exists("filertereddata",$_SESSION) && isset($_SESSION["filertereddata"])) { $data=$_SESSION["filertereddata"]; } else { $data=getDataFromExternalURL(); } if(!empty($_GET['sort']) && $_GET['sort'] == 'alphabetical') { usort($data, function ($a, $b) { return strcmp($a->Name, $b->Name); }); } else { usort($data, function ($a, $b) { return $b->ID - $a->ID; }); } return $data; } function getDataFromExternalURL() { /***** YOUR LOGIC TO GET DATA FROM EXTERNAL URL; *****/ $data = array(); foreach ($homepage as $homepage2) { $tmp=json_decode($homepage2, false); $data = array_merge($data,$tmp->info->collection); } $_SESSION["filertereddata"]=$data; return $data; } 我希望这可以严格使用 PHP 解决你的问题。 同时,不要忘记在你将使用这些函数的 PHP 文件顶部写上 session_start();。
ID
和Name
值的确切方式?我不认为你只是这样输出它们而没有HTML。基于Javascript的解决方案需要知道你将它们放在哪个HTML结构中。 - trincot