2016-07-13 3 views
1

У меня проблема с использованием функции usort. Мой массив имеет следующую модель:PHP: Object of class Closure не может быть преобразован в int

Fusion 
| 
| Array_1 
| | 
| | Array_1_1 
| | | clock => "08:08" 
| | | //Other fields 
| | | 
| | 
| | Array_1_2 
| | | clock => "04:51" 
| | | //Other fields 
| | | 
| 
| Array_2 
| ... 

Я хочу, чтобы отсортировать массивы в МассивоМ базировании на поле «Часов». Я сделал этот код, основываясь на PHP документации usort (4), например:

foreach ($fusion as $fus){ 
    usort($fus,function ($key = 'clock'){ 
     return function ($a,$b) use ($key){ 
      return strnatcmp($a[$key],$b[$key]); 
     }; 
    }); 
} 

... но он возвращает следующее исключение:

Object of class Closure could not be converted to int 

У вас есть какие-либо идеи? Спасибо за вашу помощь.

+0

Что вы пытаетесь делать с этой 'функции ($ ключ =«часы»)' ...? – deceze

ответ

2

Вы пытаетесь передать следующее в качестве обратного вызова (второй аргумент usort)

function ($key = 'clock'){ 
     return function ($a,$b) use ($key){ 
      return strnatcmp($a[$key],$b[$key]); 
     }; 
} 

Но документация четко указывает, что

Функция сравнения должна возвращать целое число [.. .]

Однако ваш обратный вызов возвращает еще одно закрытие. Вот почему вы получаете исключение Closure to int convertion Exception.

Я считаю, что вы пытаетесь выполнить внутреннее закрытие, чтобы получить окончательный обратный вызов, используя правильные значения. Я бы сказал, что это бесполезно, потому что, в отличие от Javascript, закрытие php является отказом, а не все-в, что означает, что их контекст должен быть включен в use так, как вы делали для $key во внешнем закрытии.

Вы могли бы просто сделать:

$key = 'clock'; 
foreach ($fusion as $fus){ 
    usort($fus,function ($a,$b) use ($key){ 
      return strnatcmp($a[$key],$b[$key]); 
    }); 
} 

И если $key приходит из какого-то другого вида связи вы можете просто отрегулировать назначение переменной.

+0

Больше никаких исключений, но сортировка не работает. Я постараюсь выяснить, почему. – morandmr

+0

Вы имеете в виду, что результаты не то, что вы ожидаете? Видите ли вы какие-либо изменения в заказе массива, по крайней мере? Подтвердили ли вы, что 'strnatcmp' работает так, как вы ожидаете от времени? – Sebas

+0

Вы правы, strnatcmp не вернул то, что я ожидал. Теперь я конвертирую свои строки в DateFormat, он возвращает правильные результаты, но в моем массиве изменений нет. Вот мой код: 'foreach ($ fusion as $ fus) { usort ($ fus, function ($ a, $ b) use ($ key) { $ date1 = date_create_from_format ('H: i', $ a [$ key]); $ date2 = date_create_from_format ('H: i', $ b [$ key]); return ($ date1> $ date2)? - 1: 1; }); } ' E.g.: 20:51> 01:02? res = Да 08:53> 20:51? res = No EDIT: как я могу поместить строки? – morandmr

-2

Преобразование объекта в массив с использованием get_object_vars($object).

Если объект, который вы получаете, генерируется другой функцией, затем прочитайте документацию для этой функции и найдите способ вернуть массив вместо объекта.

Примеры и документацию можно найти здесь http://php.net/manual/en/function.get-object-vars.php