Сортировка массива по порядку отдельного массива - PullRequest
3 голосов
/ 25 февраля 2011

Код, который я написал, основан на этом похожем вопросе , однако у меня возникают проблемы с преобразованием его в работу внутри класса и без использования глобальных символов .

Вот что я хочу сделать.

Предположим, у меня есть 2 массива:

$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 в порядке, указанном в $headings с неопределенными ключами, появляющимися в конце.Например, после сортировки $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_walk($rows, array($this, "sort_it")); будет использовать $this->sort_it().К сожалению, это должно работать в PHP 5.2.14 (поэтому не нужно фантазировать с 5.3).

Спасибо.

1 Ответ

2 голосов
/ 25 февраля 2011
$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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...