由于致命错误(PHP 错误)重写 usort 函数


Rewriting usort function because of fatal error (PHP bug)

以下两个 usort 函数抛出致命错误 在我们的生产环境中找不到用于闭包的基本 lambda 函数 (PHP 5.4)。这似乎是一个已知的PHP错误,现在应该修复(https://bugs.php.net/bug.php?id=52144),但它仍然发生在我们身上。

无论如何,不幸的是,我们没有时间弄清楚我们的PHP配置等问题。我们希望在不使用匿名函数的情况下重写这两个函数,以便不再发生错误。

1) 按键"位置"的值对多维数组 ($array) 进行排序:

之前的数组数组(    [0] => 数组        (            [FTID] => 3339685            [位置] => 2            [奥斯瓦尔] => 7179726            [keine_antwort] =>        )    [1] => 数组        (            [FTID] => 3339686            [位置] => 1            [奥斯瓦尔] => 7179727            [keine_antwort] =>        ))
// FUNCTION THAT NEEDS TO BE REWRITTEN
usort($array, function($a, $b) {
    return $a['position'] - $b['position'];
});
之后的数组数组(    [0] => 数组        (            [FTID] => 3339686            [位置] => 1            [奥斯瓦尔] => 7179727            [keine_antwort] =>        )    [1] => 数组        (            [FTID] => 3339685            [位置] => 2            [奥斯瓦尔] => 7179726            [keine_antwort] =>        ))

2) 根据第二个数组 ($position_order) 的顺序对多维数组 ($array) 进行排序:

$array之前数组(    [0] => 数组        (            [FTID] => 3339685            [位置] => 1            [奥斯瓦尔] => 7179726            [keine_antwort] =>        )    [1] => 数组        (            [FTID] => 3339686            [位置] => 2            [奥斯瓦尔] => 7179727            [keine_antwort] =>        ))$position_order(键值对应于$array中的键"ftid"数组(    [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数组(    [0] => 数组        (            [FTID] => 3339686            [位置] => 2            [奥斯瓦尔] => 7179727            [keine_antwort] =>        )    [1] => 数组        (            [FTID] => 3339685            [位置] => 1            [奥斯瓦尔] => 7179726            [keine_antwort] =>        ))

尤其是后者会引起一些头痛,因为我们不知道如何传递"外部"数组 $position_order。

有人可能会想出一个更好的 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);
}

适用于第二个(可能需要更好的功能名称):

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