1

以下兩個usort函數引發致命錯誤在我們的生產環境(PHP 5.4)中發現基於閉包lambda函數。這似乎是一個已知的PHP錯誤,現在應該修復(https://bugs.php.net/bug.php?id=52144),但它仍然適用於我們。因致命錯誤而重寫usort函數(PHP bug)

無論如何,我們很遺憾沒有時間弄清楚我們的PHP配置等有什麼問題。我們想在不使用匿名函數的情況下重寫這兩個函數,以避免錯誤再次發生。

1)排序方式鍵的 「位置」 值的多維陣列($陣列)的:

 
// ARRAY BEFORE 

Array 
(
    [0] => Array 
     (
      [ftid] => 3339685 
      [position] => 2 
      [auswahl] => 7179726 
      [keine_antwort] => 
     ) 

    [1] => Array 
     (
      [ftid] => 3339686 
      [position] => 1 
      [auswahl] => 7179727 
      [keine_antwort] => 
     ) 
) 
// FUNCTION THAT NEEDS TO BE REWRITTEN 

usort($array, function($a, $b) { 
    return $a['position'] - $b['position']; 
}); 
 
// ARRAY AFTER 

Array 
(
    [0] => Array 
     (
      [ftid] => 3339686 
      [position] => 1 
      [auswahl] => 7179727 
      [keine_antwort] => 
     ) 

    [1] => Array 
     (

      [ftid] => 3339685 
      [position] => 2 
      [auswahl] => 7179726 
      [keine_antwort] => 
     ) 
) 

2)多維數組的排序($陣列)($ position_order):

 
// $array before 

Array 
(
    [0] => Array 
     (
      [ftid] => 3339685 
      [position] => 1 
      [auswahl] => 7179726 
      [keine_antwort] => 
     ) 

    [1] => Array 
     (
      [ftid] => 3339686 
      [position] => 2 
      [auswahl] => 7179727 
      [keine_antwort] => 
     ) 

) 

// $position_order (key value corresponds to key 'ftid' in $array 

Array 
(
    [3339686] => 1 
    [3339685] => 2 

) 
// FUNCTION THAT NEEDS TO BE REWRITTEN 

usort($array, function($a, $b) use($position_order) { 
    return (isset($position_order[$a['ftid']]) ? ($position_order[$a['ftid']] - $position_order[$b['ftid']]) : 1); 
}); 
 
// $array 

Array 
(
    [0] => Array 
     (
      [ftid] => 3339686 
      [position] => 2 
      [auswahl] => 7179727 
      [keine_antwort] => 
     ) 

    [1] => Array 
     (
      [ftid] => 3339685 
      [position] => 1 
      [auswahl] => 7179726 
      [keine_antwort] => 
     ) 

) 

特別是後者導致一些頭痛,因爲我們不知道如何傳遞「外部」數組$ position_order。

+1

也許是原始數組和結果數組的一個例子。 – AbraCadaver

+1

它工作還是找到別的東西? – AbraCadaver

回答

0

有人可能會想出一個更好的usort實現,但第一個至少,這是我要做的事:

function array_column_sort(&$array, $column, $sort=SORT_ASC) { 
    foreach($array as $key => $val) { 
     $sort_array[$key] = $val[$column]; 
    } 
    array_multisort($sort_array, $sort, $array); 
} 

工程第二(可能需要更好的FUNC名):

function array_column_sort_array(&$array, $column, $sort_array) { 
    foreach($array as $val) { 
     $result[$sort_array[$val[$column]]] = $val; 
    } 
    ksort($result); 
    $array = array_values($result); 
}