复杂的数组排序php


Complicated array sorting php

我想在php中对这个json数组进行排序,但我不知道怎么做。
我想要最新一季和最新一集在1,最新一期最新一集中在2,等等

$episodelist = json_decode(file_get_contents('cache/episodes.json'), true);
$episodes = $episodelist["doctor who (2005)"];

json数组:

"doctor who (2005)": {
        "1": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58259'/doctor-who-extra-s01e03-robot-of-sherwood-pdtv-x264-deadpool'/",
            "name": "Doctor Who Extra S01E03 Robot Of Sherwood PDTV x264-DEADPOOL (124.73 MB)",
            "season": "1",
            "episode": "3",
            "magnet": "magnet:?xt=urn:btih:DZ7H4EWP2XW6YRYIXEIPMULETLASGDAF&dn=Doctor.Who.Extra.S01E03.Robot.Of.Sherwood.PDTV.x264-DEADPOOL&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "2": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58254'/doctor-who-2005-8x03-robot-of-sherwood-720p-hdtv-x264-fov'/",
            "name": "Doctor Who 2005 8x03 Robot Of Sherwood 720p HDTV x264-FoV (1.02 GB)",
            "season": "8",
            "episode": "3",
            "magnet": "magnet:?xt=urn:btih:S25AOAFO5ZUGXMZ52ZI2OUD5S5TD4ZBI&dn=Doctor.Who.2005.8x03.Robot.Of.Sherwood.720p.HDTV.x264-FoV&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "3": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58252'/doctor-who-extra-s01e02-into-the-dalek-720p-webrip-x264-c4tv'/",
            "name": "Doctor Who Extra S01E02 Into The Dalek 720p Webrip x264-C4TV (203.70 MB)",
            "season": "1",
            "episode": "2",
            "magnet": "magnet:?xt=urn:btih:FQ6CNHRGQSRKFWIX63JGG4KWLVVOZJQX&dn=Doctor.Who.Extra.S01E02.Into.The.Dalek.720p.Webrip.x264-C4TV&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "4": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58251'/doctor-who-extra-s01e02-into-the-dalek-webrip-x264-c4tv'/",
            "name": "Doctor Who Extra S01E02 Into The Dalek Webrip x264-C4TV (81.13 MB)",
            "season": "1",
            "episode": "2",
            "magnet": "magnet:?xt=urn:btih:OZ7O2O3FE7RADBGOAJEE4UMBROPO7CW7&dn=Doctor.Who.Extra.S01E02.Into.The.Dalek.Webrip.x264-C4TV&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "5": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58248'/doctor-who-2005-s08e03-hdtv-x264-tla'/",
            "name": "Doctor Who 2005 S08E03 HDTV x264-TLA (399.11 MB)",
            "season": "8",
            "episode": "3",
            "magnet": "magnet:?xt=urn:btih:SYDVQP4NMZJ5MQ2CEIOPZWUBLQWNKKHO&dn=Doctor.Who.2005.S08E03.HDTV.x264-TLA&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        }

我希望它成为的阵列:

"doctor who (2005)": {
        "1": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58248'/doctor-who-2005-s08e03-hdtv-x264-tla'/",
            "name": "Doctor Who 2005 S08E03 HDTV x264-TLA (399.11 MB)",
            "season": "8",
            "episode": "3",
            "magnet": "magnet:?xt=urn:btih:SYDVQP4NMZJ5MQ2CEIOPZWUBLQWNKKHO&dn=Doctor.Who.2005.S08E03.HDTV.x264-TLA&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "2": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58254'/doctor-who-2005-8x03-robot-of-sherwood-720p-hdtv-x264-fov'/",
            "name": "Doctor Who 2005 8x03 Robot Of Sherwood 720p HDTV x264-FoV (1.02 GB)",
            "season": "8",
            "episode": "3",
            "magnet": "magnet:?xt=urn:btih:S25AOAFO5ZUGXMZ52ZI2OUD5S5TD4ZBI&dn=Doctor.Who.2005.8x03.Robot.Of.Sherwood.720p.HDTV.x264-FoV&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "3": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58259'/doctor-who-extra-s01e03-robot-of-sherwood-pdtv-x264-deadpool'/",
            "name": "Doctor Who Extra S01E03 Robot Of Sherwood PDTV x264-DEADPOOL (124.73 MB)",
            "season": "1",
            "episode": "3",
            "magnet": "magnet:?xt=urn:btih:DZ7H4EWP2XW6YRYIXEIPMULETLASGDAF&dn=Doctor.Who.Extra.S01E03.Robot.Of.Sherwood.PDTV.x264-DEADPOOL&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "4": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58251'/doctor-who-extra-s01e02-into-the-dalek-webrip-x264-c4tv'/",
            "name": "Doctor Who Extra S01E02 Into The Dalek Webrip x264-C4TV (81.13 MB)",
            "season": "1",
            "episode": "2",
            "magnet": "magnet:?xt=urn:btih:OZ7O2O3FE7RADBGOAJEE4UMBROPO7CW7&dn=Doctor.Who.Extra.S01E02.Into.The.Dalek.Webrip.x264-C4TV&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        },
        "5": {
            "link": "https:'/'/eztv-proxy.net'/'/ep'/58252'/doctor-who-extra-s01e02-into-the-dalek-720p-webrip-x264-c4tv'/",
            "name": "Doctor Who Extra S01E02 Into The Dalek 720p Webrip x264-C4TV (203.70 MB)",
            "season": "1",
            "episode": "2",
            "magnet": "magnet:?xt=urn:btih:FQ6CNHRGQSRKFWIX63JGG4KWLVVOZJQX&dn=Doctor.Who.Extra.S01E02.Into.The.Dalek.720p.Webrip.x264-C4TV&tr=udp:'/'/tracker.openbittorrent.com:80&tr=udp:'/'/tracker.publicbt.com:80&tr=udp:'/'/tracker.istole.it:80&tr=udp:'/'/open.demonii.com:80&tr=udp:'/'/tracker.coppersurfer.tk:80"
        }

您将希望通过usort()实现自定义排序。大致如下:

$episodelist = json_decode(file_get_contents('cache/episodes.json'), true);
foreach ($episodelist as &$show) {
    usort($show, function ($a, $b) {
            if ($a["season"] == $b["season"]) {
                if ($a["episode"] == $b["episode"]) {
                    return 0;
                }
                return ($a["episode"] > $b["episode"]) ? -1 : 1;
            }
            return ($a["season"] > $b["season"]) ? -1 : 1;
        }
    );
}
var_export($episodelist);

输出:

array (
    'doctor who (2005)' =>
        array (
            0 =>
                array (
                    'link' => 'https://eztv-proxy.net//ep/58248/doctor-who-2005-s08e03-hdtv-x264-tla/',
                    'name' => 'Doctor Who 2005 S08E03 HDTV x264-TLA (399.11 MB)',
                    'season' => '8',
                    'episode' => '3',
                    'magnet' => 'magnet:?xt=urn:btih:SYDVQP4NMZJ5MQ2CEIOPZWUBLQWNKKHO&dn=Doctor.Who.2005.S08E03.HDTV.x264-TLA&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.istole.it:80&tr=udp://open.demonii.com:80&tr=udp://tracker.coppersurfer.tk:80',
                ),
            1 =>
                array (
                    'link' => 'https://eztv-proxy.net//ep/58254/doctor-who-2005-8x03-robot-of-sherwood-720p-hdtv-x264-fov/',
                    'name' => 'Doctor Who 2005 8x03 Robot Of Sherwood 720p HDTV x264-FoV (1.02 GB)',
                    'season' => '8',
                    'episode' => '3',
                    'magnet' => 'magnet:?xt=urn:btih:S25AOAFO5ZUGXMZ52ZI2OUD5S5TD4ZBI&dn=Doctor.Who.2005.8x03.Robot.Of.Sherwood.720p.HDTV.x264-FoV&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.istole.it:80&tr=udp://open.demonii.com:80&tr=udp://tracker.coppersurfer.tk:80',
                ),
            2 =>
                array (
                    'link' => 'https://eztv-proxy.net//ep/58259/doctor-who-extra-s01e03-robot-of-sherwood-pdtv-x264-deadpool/',
                    'name' => 'Doctor Who Extra S01E03 Robot Of Sherwood PDTV x264-DEADPOOL (124.73 MB)',
                    'season' => '1',
                    'episode' => '3',
                    'magnet' => 'magnet:?xt=urn:btih:DZ7H4EWP2XW6YRYIXEIPMULETLASGDAF&dn=Doctor.Who.Extra.S01E03.Robot.Of.Sherwood.PDTV.x264-DEADPOOL&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.istole.it:80&tr=udp://open.demonii.com:80&tr=udp://tracker.coppersurfer.tk:80',
                ),
            3 =>
                array (
                    'link' => 'https://eztv-proxy.net//ep/58252/doctor-who-extra-s01e02-into-the-dalek-720p-webrip-x264-c4tv/',
                    'name' => 'Doctor Who Extra S01E02 Into The Dalek 720p Webrip x264-C4TV (203.70 MB)',
                    'season' => '1',
                    'episode' => '2',
                    'magnet' => 'magnet:?xt=urn:btih:FQ6CNHRGQSRKFWIX63JGG4KWLVVOZJQX&dn=Doctor.Who.Extra.S01E02.Into.The.Dalek.720p.Webrip.x264-C4TV&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.istole.it:80&tr=udp://open.demonii.com:80&tr=udp://tracker.coppersurfer.tk:80',
                ),
            4 =>
                array (
                    'link' => 'https://eztv-proxy.net//ep/58251/doctor-who-extra-s01e02-into-the-dalek-webrip-x264-c4tv/',
                    'name' => 'Doctor Who Extra S01E02 Into The Dalek Webrip x264-C4TV (81.13 MB)',
                    'season' => '1',
                    'episode' => '2',
                    'magnet' => 'magnet:?xt=urn:btih:OZ7O2O3FE7RADBGOAJEE4UMBROPO7CW7&dn=Doctor.Who.Extra.S01E02.Into.The.Dalek.Webrip.x264-C4TV&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.istole.it:80&tr=udp://open.demonii.com:80&tr=udp://tracker.coppersurfer.tk:80',
                ),
        ),
)

我想您想要一个具有以下comperator函数的usort()

usort($array, function($a, $b){
    return $a['season'] * 1000 + $a['episode'] < $b['season'] * 1000 + $b['episode'] ? 1 : -1;
});

解释

usort函数使用所提供的函数作为比较器来决定哪个元素是第一个。通过这种方式,它对所有元素进行排序。我不确定你是否必须把它倒过来。如果是这样的话,就把<换成>。我使用因子1000使季节参数比集参数更强。我认为每一季的剧集永远不会超过999集。

编辑

当然,您需要使用json_decode将json字符串转换为php数组。

编辑2

添加了内联if语句以使其正常工作(?1:-1)