Php 根据单独数组的顺序对数组进行排序

Php 根据单独数组的顺序对数组进行排序,php,arrays,sorting,Php,Arrays,Sorting,我所写的代码是基于此编写的,但是我很难将其转换为在类中工作,并且不使用globals 这是我想做的 假设我有两个数组: $headings = array( 'id' => 'ID', 'name' => 'Name', ); $rows = array( array( 'id' => 1, 'name' => 'Jo Blogs', ), array( 'name' => '

我所写的代码是基于此编写的,但是我很难将其转换为在类中工作,并且不使用globals

这是我想做的

假设我有两个数组:

$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;
}