2011-04-13 333 views
1

如何通過權重和類型對關聯數組排序?PHP:排序數組幫助

輸入

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

回答

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']); 
} 
+0

謝謝!我忘了我不得不面對相反的情況。 – 2011-04-13 16:19:35

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

(警告,這是未經測試)

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

另外,如果你添加任何數量的類型的這個作品你要以相同的方式排序。