我有以下数组:
$array = [
'note' => [],
'year' => ['2011','2010', '2012'],
'type' => ['conference', 'journal', 'conference'],
];
我使用下面的函数,通过字段类型和另一个数组对数组进行排序:
function array_multisort_by_order(array $array, $by, array $order)
{
$order = array_flip($order);
$params[] = $array[$by];
foreach($params[0] as &$v) $v = $order[$v];
foreach($array as &$v) $params[] = &$v; unset($v);
call_user_func_array('array_multisort', $params);
return $array;
}
当我调用下面的函数时,我得到了下面的错误:
$array = array_multisort_by_order($array, 'type', array('conference', 'journal'));
print_r($array['type']);
错误:
Warning: array_multisort(): Array sizes are inconsistent.
我知道数组是不一致的,有没有更好的函数?
请检查:codepad
预期输出:
Array
(
[note] => Array
(
[0] =>
[1] =>
[2] =>
)
[year] => Array
(
[0] => 2011
[1] => 2012
[2] => 2010
)
[type] => Array
(
[0] => conference
[1] => conference
[2] => journal
)
)
例二:
- 阵列**
$array = [
'note' => ['test1', 'test2'],
'year' => ['2011', '2012'],
'type' => ['conference', 'journal', 'conference'],
];
- 预期结果2**
Array
(
[note] => Array
(
[0] => test1
[1] =>
[2] => tes2
)
[year] => Array
(
[0] => 2011
[1] => 2012
[2] =>
)
[type] => Array
(
[0] => conference
[1] => conference
[2] => journal
)
)
2条答案
按热度按时间2fjabf4q1#
好的,首先想到的解决方案之一就是添加空值,使它们一致:
z9smfwbn2#
1.填充行以具有一致的元素计数。
1.使用自定义排序条件生成查找数组,然后使用这些转换值填充第一个排序参数。
1.将所有行作为引用变量压入排序参数的有效负载。
1.使用
array_multisort()
排序。不需要return
,因为所有排序操作都通过引用完成。代码:(Demo)
如果输入数组的第一级键是数字键,则可以进一步压缩上面的代码片段,并删除最后一个
foreach()
(因为可以使用array_multisort()
中的spread操作符来解压缩数字键)、Demo甚至Demo相关答案:Sort array using array_multisort() with dynamic number of arguments/parameters/rules/data