1

Две следующие функции usort вызывают фатальную ошибку Базовая лямбда-функция для закрытия не найдена в нашей продуктивной среде (PHP 5.4). Это, похоже, известная ошибка PHP, которая должна быть исправлена ​​к настоящему времени (https://bugs.php.net/bug.php?id=52144), но это все еще происходит для нас.Перезапись функции usort из-за фатальной ошибки (ошибка PHP)

В любом случае, к сожалению, у нас нет времени выяснить, что не так с нашими конфигурациями 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); 
}