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