PHP按值对复杂多维数组进行排序

PHP按值对复杂多维数组进行排序,php,arrays,sorting,multidimensional-array,Php,Arrays,Sorting,Multidimensional Array,我有一个生成HTML表的多维数组 数组中的数据: Array ( [header] => Array ( [1] => Array ( [0] => Array ( [col_pos] => 1

我有一个生成HTML表的多维数组

数组中的数据:

Array
(
    [header] => Array
        (
            [1] => Array
                (
                    [0] => Array
                        (
                            [col_pos] => 1
                            [sortable] => 1
                            [content] => Compare
                            [sort_value] => 
                            [ct_help] => Compare help text..
                        )

                    [1] => Array
                        (
                            [col_pos] => 2
                            [sortable] => 1
                            [content] => Product
                            [sort_value] => 
                            [ct_help] => Product help text..
                        )

                    [2] => Array
                        (
                            [col_pos] => 3
                            [sortable] => 1
                            [content] => Type of Cover
                            [sort_value] => 
                            [ct_help] => Type of cover help text..
                        )

                    [3] => Array
                        (
                            [col_pos] => 4
                            [sortable] => 1
                            [content] => Roadside Assistance
                            [sort_value] => 
                            [ct_help] => Roadside assistance help text...
                        )

                    [4] => Array
                        (
                            [col_pos] => 5
                            [sortable] => 1
                            [content] => Nationwhide Recovery
                            [sort_value] => 
                            [ct_help] => Nationwide Recover help text...
                        )

                    [5] => Array
                        (
                            [col_pos] => 9
                            [sortable] => 1
                            [content] => Price
                            [sort_value] => 
                            [ct_help] => Price help text...
                        )

                    [6] => Array
                        (
                            [col_pos] => 10
                            [sortable] => 1
                            [content] => 
                            [sort_value] => 
                            [ct_help] => 
                        )

                )

        )

    [row] => Array
        (
            [2] => Array
                (
                    [0] => Array
                        (
                            [col_pos] => 1
                            [sortable] => 0
                            [content] => Logo
                            [sort_value] => 
                            [ct_help] => 
                        )

                    [1] => Array
                        (
                            [col_pos] => 2
                            [sortable] => 0
                            [content] => Product cover 2
                            [sort_value] => 2
                            [ct_help] => 
                        )

                    [2] => Array
                        (
                            [col_pos] => 3
                            [sortable] => 0
                            [content] => Vehicle & Personal 2
                            [sort_value] => 2
                            [ct_help] => 
                        )

                    [3] => Array
                        (
                            [col_pos] => 4
                            [sortable] => 0
                            [content] => <b>Yes</b>
                            [sort_value] => 1
                            [ct_help] => 
                        )

                    [4] => Array
                        (
                            [col_pos] => 5
                            [sortable] => 0
                            [content] => No
                            [sort_value] => 0
                            [ct_help] => 
                        )

                    [5] => Array
                        (
                            [col_pos] => 9
                            [sortable] => 0
                            [content] => from 75 GBP
                            [sort_value] => 75
                            [ct_help] => 
                        )

                    [6] => Array
                        (
                            [col_pos] => 10
                            [sortable] => 0
                            [content] => <a href="#2">Visit site ></a>
                            [sort_value] => 
                            [ct_help] => 
                        )

                )

            [3] => Array
                (
                    [0] => Array
                        (
                            [col_pos] => 1
                            [sortable] => 0
                            [content] => Logo
                            [sort_value] => 
                            [ct_help] => 
                        )

                    [1] => Array
                        (
                            [col_pos] => 2
                            [sortable] => 0
                            [content] => Product cover 3
                            [sort_value] => 3
                            [ct_help] => 
                        )

                    [2] => Array
                        (
                            [col_pos] => 3
                            [sortable] => 0
                            [content] => Vehicle & Personal 3
                            [sort_value] => 3
                            [ct_help] => 
                        )

                    [3] => Array
                        (
                            [col_pos] => 4
                            [sortable] => 0
                            [content] => No
                            [sort_value] => 0
                            [ct_help] => 
                        )

                    [4] => Array
                        (
                            [col_pos] => 5
                            [sortable] => 0
                            [content] => <b>Yes</b>
                            [sort_value] => 1
                            [ct_help] => 
                        )

                    [5] => Array
                        (
                            [col_pos] => 9
                            [sortable] => 0
                            [content] => from 73 GBP
                            [sort_value] => 73
                            [ct_help] => 
                        )

                    [6] => Array
                        (
                            [col_pos] => 10
                            [sortable] => 0
                            [content] => <a href="#3">Visit site ></a>
                            [sort_value] => 
                            [ct_help] => 
                        )

                )

            [4] => Array
                (
                    [0] => Array
                        (
                            [col_pos] => 1
                            [sortable] => 0
                            [content] => Logo
                            [sort_value] => 
                            [ct_help] => 
                        )

                    [1] => Array
                        (
                            [col_pos] => 2
                            [sortable] => 0
                            [content] => Product cover 4
                            [sort_value] => 4
                            [ct_help] => 
                        )

                    [2] => Array
                        (
                            [col_pos] => 3
                            [sortable] => 0
                            [content] => Vehicle & Personal 4
                            [sort_value] => 4
                            [ct_help] => 
                        )

                    [3] => Array
                        (
                            [col_pos] => 4
                            [sortable] => 0
                            [content] => <b>Yes</b>
                            [sort_value] => 1
                            [ct_help] => 
                        )

                    [4] => Array
                        (
                            [col_pos] => 5
                            [sortable] => 0
                            [content] => <b>Yes</b>
                            [sort_value] => 1
                            [ct_help] => 
                        )

                    [5] => Array
                        (
                            [col_pos] => 9
                            [sortable] => 0
                            [content] => from 84 GBP
                            [sort_value] => 84
                            [ct_help] => 
                        )

                    [6] => Array
                        (
                            [col_pos] => 10
                            [sortable] => 0
                            [content] => <a href="#4">Visit site ></a>
                            [sort_value] => 
                            [ct_help] => 
                        )

                )

            [5] => Array
                (
                    [0] => Array
                        (
                            [col_pos] => 1
                            [sortable] => 0
                            [content] => Logo
                            [sort_value] => 
                            [ct_help] => 
                        )

                    [1] => Array
                        (
                            [col_pos] => 2
                            [sortable] => 0
                            [content] => Product cover 5
                            [sort_value] => 5
                            [ct_help] => 
                        )

                    [2] => Array
                        (
                            [col_pos] => 3
                            [sortable] => 0
                            [content] => Vehicle & Personal 5
                            [sort_value] => 5
                            [ct_help] => 
                        )

                    [3] => Array
                        (
                            [col_pos] => 4
                            [sortable] => 0
                            [content] => No
                            [sort_value] => 0
                            [ct_help] => 
                        )

                    [4] => Array
                        (
                            [col_pos] => 5
                            [sortable] => 0
                            [content] => <b>Yes</b>
                            [sort_value] => 1
                            [ct_help] => 
                        )

                    [5] => Array
                        (
                            [col_pos] => 9
                            [sortable] => 0
                            [content] => from 96 GBP
                            [sort_value] => 96
                            [ct_help] => 
                        )

                    [6] => Array
                        (
                            [col_pos] => 10
                            [sortable] => 0
                            [content] => <a href="#5">Visit site ></a>
                            [sort_value] => 
                            [ct_help] => 
                        )

                )

        )

)
现在我希望能够按“价格”排序,但正如您在数组中看到的,价格单元格的“内容”键是一个字符串,我们需要按“排序值”键对其进行排序。其他可排序的列,如“路边”或“全国”,也应按其“排序值”键进行排序

我尝试了不同的数组_multisort或usort组合,但没有成功

在此方面的任何帮助都将不胜感激。如果您有问题,请随时提问


提前感谢。

这里有一个函数,可以按您希望的方式对列表进行排序。它首先在数组的
标题
部分中搜索要排序的字段的键,然后根据该键的
可排序
值对
部分进行排序:

function sort_list($list, $field, $ascending = true) {
    $headers = array_values($list['header'])[0];
    if (($key = array_search($field, array_column($headers, 'content'))) === false || $headers[$key]['sortable'] == 0) {
        // can't find field or field is not sortable, do nothing
        return $list;
    }
    usort($list['row'], function ($a, $b) use ($key, $ascending) {
        return $ascending ? $a[$key]['sort_value'] <=> $b[$key]['sort_value'] : $b[$key]['sort_value'] <=> $a[$key]['sort_value'];
    });
    return $list;
}

您忘记发布代码了
function sort_list($list, $field, $ascending = true) {
    $headers = array_values($list['header'])[0];
    if (($key = array_search($field, array_column($headers, 'content'))) === false || $headers[$key]['sortable'] == 0) {
        // can't find field or field is not sortable, do nothing
        return $list;
    }
    usort($list['row'], function ($a, $b) use ($key, $ascending) {
        return $ascending ? $a[$key]['sort_value'] <=> $b[$key]['sort_value'] : $b[$key]['sort_value'] <=> $a[$key]['sort_value'];
    });
    return $list;
}
sort_list($data, 'Price');