PHP:帮助排序数组

时间:2011-04-13 16:06:36

标签: php arrays sorting

如何按权重和类型对关联数组进行排序?

输入

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 个答案:

答案 0 :(得分:2)

您的功能未考虑($ 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 :(得分:1)

试试这个:

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

(警告,这是未经测试的)

答案 2 :(得分:0)

辅助功能

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,
));

答案 3 :(得分:0)

更简单的方法是 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);

如果你想以相同的方式添加任意数量的类型,那么这是有效的。