Php 根据单独数组的顺序对数组进行排序
我所写的代码是基于此编写的,但是我很难将其转换为在类中工作,并且不使用globals 这是我想做的 假设我有两个数组:Php 根据单独数组的顺序对数组进行排序,php,arrays,sorting,Php,Arrays,Sorting,我所写的代码是基于此编写的,但是我很难将其转换为在类中工作,并且不使用globals 这是我想做的 假设我有两个数组: $headings = array( 'id' => 'ID', 'name' => 'Name', ); $rows = array( array( 'id' => 1, 'name' => 'Jo Blogs', ), array( 'name' => '
$headings = array(
'id' => 'ID',
'name' => 'Name',
);
$rows = array(
array(
'id' => 1,
'name' => 'Jo Blogs',
),
array(
'name' => 'John Smith',
'id' => 2,
'other' => 'Potentially other data'
),
);
我想将$行
按$标题
中指定的顺序排序,所有未定义的键都出现在末尾。例如,在排序$rows
之后,其外观如下:
$rows = array(
array(
'id' => 1,
'name' => 'Jo Blogs',
),
array(
'id' => 2,
'name' => 'John Smith',
'other' => 'Potentially other data'
),
);
在类之外工作的代码是:
$headings = array(
'id' => 'ID',
'name' => 'Name',
);
$rows = array(
array(
'id' => 1,
'name' => 'Jo Blogs',
),
array(
'name' => 'John Smith',
'id' => 2,
'other' => 'Potentially other data'
),
);
var_dump($rows);
array_walk($rows, "sort_it");
var_dump($rows);
function sort_it(&$value, $key) {
uksort($value, "cmp");
}
function cmp($a, $b) {
global $headings;
if (!isset($headings[$a]) || !isset($headings[$b]) || $headings[$a]>$headings[$b]){
return 1;
}else{
return -1;
}
}
和产出:
array
0 =>
array
'id' => int 1
'name' => string 'Jo Blogs' (length=8)
1 =>
array
'name' => string 'John Smith' (length=10)
'id' => int 2
'other' => string 'Potentially other data' (length=22)
array
0 =>
array
'id' => int 1
'name' => string 'Jo Blogs' (length=8)
1 =>
array
'id' => int 2
'name' => string 'John Smith' (length=10)
'other' => string 'Potentially other data' (length=22)
这是正确的。那么,我又该如何摆脱对全球资源的使用呢。我知道array\u walk($rows,array($this,“sort\u it”))
将使用$this->sort\u it()
。不幸的是,这必须在PHP5.2.14中工作(因此5.3中没有什么特别之处)
谢谢。您需要与5.3以上的PHP版本兼容吗?@BoltClock-很遗憾,需要。5.2.14. 我也会在问题上加上这个,谢谢。
$result = fix_array_order($rows, $headings);
print_r($result);
function fix_array_order($array, $order_array)
{
$order = array_keys($order_array);
$result = array();
foreach($array as $arr)
{
$new_sub_array = array();
foreach($order as $key)
{
$new_sub_array[$key] = $arr[$key];
}
$diff = array_diff(array_keys($arr), $order);
foreach($diff as $diff_key)
{
$new_sub_array[$diff_key] = $arr[$key];
}
$result[] = $new_sub_array;
}
return $result;
}