PHP: Помощь с сортировкой массива - PullRequest
1 голос
/ 13 апреля 2011

Как можно отсортировать ассоциативный массив по типу веса И?

Вход

array(
    'a'     => array( 'type' => 't1', 'weight' => 1, 'text' => 'text1' ),
    'b'     => array( 'type' => 't1', 'weight' => 3, 'text' => 'text2' ),
    'c'     => array( 'type' => 't2', 'weight' => 5, 'text' => 'text3' ),
    'd'     => array( 'type' => 't1', 'weight' => 2, 'text' => 'text4' ),
    'e'     => array( 'type' => 't2', 'weight' => 4, 'text' => 'text5' ),
    'f'     => array( 'type' => 't2', 'weight' => 4, 'text' => 'text6' )
);

Желаемый вывод

array(
    'a'     => array( 'type' => 't1', 'weight' => 1, 'text' => 'text1' ),
    'd'     => array( 'type' => 't1', 'weight' => 2, 'text' => 'text4' ),
    'b'     => array( 'type' => 't1', 'weight' => 3, 'text' => 'text2' ),
    'e'     => array( 'type' => 't2', 'weight' => 1, 'text' => 'text5' ),
    'f'     => array( 'type' => 't2', 'weight' => 1, 'text' => 'text6' ),
    'c'     => array( 'type' => 't2', 'weight' => 5, 'text' => 'text3' )
);

Тип "t2" должен появляться в конце массива, все другие типы в начале.

Вес должен быть отсортирован по типу.

Я использую uasort с пользовательскимсравнить функцию, но я изо всех сил.Вот что у меня есть, но оно не работает:

function my_comparer($a, $b) {
    return ( $a['type'] !== 't2' && $b['type'] === 't2' )
        ? -1
        : $a['weight'] - $b['weight'];
}

Ответы [ 4 ]

2 голосов
/ 13 апреля 2011

Ваша функция не учитывает ($ a ['type'] == 't2')

function my_comparer($a, $b) {
    if ( ($a['type']==='t2') && ($b['type']!=='t2')) return -1;
    if ( ($b['type']==='t2') && ($a['type']!=='t2')) return 1;
    return ($a['weight'] - $b['weight']);
}
1 голос
/ 13 апреля 2011

Попробуйте это:

function my_comparer($a, $b) {
    if( $a['type'] == $b['type'] ){
       return $a['weight'] - $b['weight'];
    }else{
       if( $a['type'] > $b['type'] ) return 1;
       else return -1;
    }
}

(предупреждение не проверено)

0 голосов
/ 13 апреля 2011

Более простой способ будет array_multisort

$data = array(
    'a'     => array( 'type' => 't1', 'weight' => 1, 'text' => 'text1' ),
    'b'     => array( 'type' => 't1', 'weight' => 3, 'text' => 'text2' ),
    'c'     => array( 'type' => 't2', 'weight' => 5, 'text' => 'text3' ),
    'd'     => array( 'type' => 't1', 'weight' => 2, 'text' => 'text4' ),
    'e'     => array( 'type' => 't2', 'weight' => 4, 'text' => 'text5' ),
    'f'     => array( 'type' => 't2', 'weight' => 4, 'text' => 'text6' )
);

// Obtain a list of columns
foreach ($data as $key => $row) {
    $type[$key]  = $row['type'];
    $weight[$key] = $row['weight'];
}
array_multisort($type, SORT_ASC, $weight, SORT_ASC, $data);

Плюс это работает, если вы добавляете любое количество типов, которые вы хотите отсортировать таким же образом.

0 голосов
/ 13 апреля 2011

Вспомогательная функция :

function arrayColumnSort(&$array, $directions) {
    // collect columns
    $columnNames = array_keys($directions);
    $columns = array();
    foreach ($array as $row) {
        foreach ($columnNames as $columnName) {
            if (!isset($columns[$columnName])) {
                $columns[$columnName] = array();
            }

            $columns[$columnName][] = isset($row[$columnName]) ? $row[$columnName] : null;
        }
    }

    // build array_multisort params
    $params = array();
    foreach ($directions as $columnName => $direction) {
        $params = array_merge(
            $params,
            array($columns[$columnName]),
            is_array($direction) ? $direction : array($direction)
        );
    }

    $params[] =& $array;

    // sort
    call_user_func_array('array_multisort', $params);
}

Вызов

arrayColumnSort($data, array(
  'type' => SORT_ASC,
  'weight' => SORT_ASC,
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...