Я знаю, что функция PHP end () существует, но мне нужно не только последнее значение объекта, мне нужны последние 500 значений.
У меня есть объект с, возможно, тысячами данных, и я хочу показать график с этими данными на своем интерфейсе. Но только последние 500 значений могут слишком сильно замедлить время отклика.
Я думал о том, чтобы, возможно, изменить значения объекта данных, взять первые 500 значений, а затем снова отменить их. Это звучит как слишком большая потраченная впустую обработка.
Я также попытался сначала преобразовать объект в массив, а затем использовать array_slice($array, -500); и преобразовать его обратно в объект PHP и использовать его в foreach. Когда я это сделаю, я получаю сообщение об ошибке:
Invalid argument supplied for foreach()
Это код:
$dataArray = array_slice((array) $data, -5);
$data = json_encode($dataArray);
У вас есть идеи, что я здесь делаю не так или как это сделать умнее?
@ShaunBebbers Срез массива с одним элементом?
Реверсирование - не такая уж дорогая операция. Я бы выбрал это решение
$ count = 1000; $ arrValue = []; для ($ i = 0; $ i <$ count; $ i ++) {array_push ($ arrValue, $ i); } // print_r ($ arrValue); $ n = 500; // требуется последнее n значений $ arr = array_slice ($ arrValue, - $ n); print_r ($ arr);
@JonStirling я получаю свой объект из этой строки: $ data = $ device-> data () -> get ();
@ShaunBebbers Когда я пытаюсь использовать вашу строку вместо этого, я все равно получаю сообщение об ошибке: 'Недопустимый аргумент для foreach ()'
@ KiJéy Итак [преобразование в массив -> реверсирование -> взятие первых 500 значений -> реверсирование] не вызовет проблем с производительностью даже для внешнего интерфейса? Я использую lavacharts, чтобы построить график данных.
Думаю, нам нужна дополнительная информация. Используйте echo print_r($data, true);, прежде чем объявлять $dataArray, говорит ли это вам, что переменная $data является массивом? Я не понимаю, почему вы пытаетесь преобразовать переменную $data в массив, как вы это делаете. Если $data - это JSON, используйте json_decode($data, true);, а не (array) $data, как вы это делаете.
Ответ @ShaunBebbers Накова сделал именно то, что я хотел, с помощью обратного метода. Вы все еще хотите, чтобы я добавил запрошенную вами информацию?
@VaryagiViking - нет ничего страшного, если вы нашли решение, но дополнительная информация в ваших вопросах будет полезна для всех, так как правильное решение сделало предположение о том, какой тип данных хранился в $data.
@ShaunBebbers Да, вы правы, я постараюсь предоставить больше информации, когда в следующий раз задам другой вопрос;) спасибо






если ваш объект $data представляет собой набор элементов, вы можете использовать следующее:
$data->reverse()->take(500)->get();
или превратите свой массив в коллекцию
collect($data)->reverse()->take(500)->get();
Если я использую верхнюю строку, я получаю «недостающие параметры для операции получения», но как только я ее удаляю, все работает нормально!
$count = 1000;
$arrValue = [];
$arrValueMD = [];
for ($i=0; $i < $count; $i++) {
array_push($arrValue, $i);
}
foreach ($arrValue as $k => &$v) {
array_push($arrValueMD, $k, $v);
// echo "Current value of \$a:$k $v.\n";
}
// print_r($arrValueMD);
$n = 500;
$arr = array_slice($arrValueMD, -$n);
print_r($arr);
Не могли бы вы привести пример вашего объекта
$data? Если это объект, который, как я предполагаю, имеет строковые свойства, как вы определяете «последние» 500 значений?