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