2016-07-05 4 views
1

Я изучаю PHP и код воспламенителя, и я новичок в современном программировании в целом, поэтому, пожалуйста, будьте добрыми!Устранение неполадок foreach loop для многомерного массива с объектами StdClass

Я написал функцию для генерации еженедельных итогов километров, проложенных на велосипеде из таблицы mysql. Моя функция генерирует многомерный массив с объектами Std Class. Когда я пытаюсь повторить результат в файле моего вида, я получаю сообщение об ошибке: Ошибка: Сообщение: объект класса stdClass не может быть преобразован в строку.

Я пробовал инструкции о том, как сделать петли foreach для многомерных массивов примерно в десять потоков, включая this one. Кажется, мне нужна вложенная структура foreach, однако я не понимаю, как применять эти примеры к моему коду.

// в моем контроллере индексной функции

$weeknumber = array(0, 1, 2, 3, 4, 5, 6, 7); 
$bikedata['sums_for_table'] = array_map(array($this->bike_model, 
    'get_weekly_sum'), $weeknumber); 

// в моей модели

public function get_weekly_sum($when) 
{ 
    $this->db->select_sum('distance'); 
    $this->db->where("WEEK (date) = WEEK(current_date) - $when AND YEAR(date) = YEAR(current_date)"); 
    $query = $this->db->get('bike_stats'); 

return $query->result(); 

// на мой взгляд (обрезается для простоты. Это на самом деле стол.)

foreach ($sums_for_table as $sum_array): 
foreach ($sum_array as $key => $object): 
echo $object; 
endforeach; 
endforeach; 

Функция работает правильно в том, что массив, возвращаемый функциями (ниже, из var_dump), имеет информацию I w (цифры 63.2 и т. д.), но мне трудно понять, как использовать информацию в этой форме.

array(8) { 
[0]=> array(1) { [0]=> object(stdClass)#23 (1) { ["distance"]=> string(4) "63.2" } } 
[1]=> array(1) { [0]=> object(stdClass)#24 (1) { ["distance"]=> string(5) "111.9" } } 
[2]=> array(1) { [0]=> object(stdClass)#25 (1) { ["distance"]=> string(4) "48.2" } } 
[3]=> array(1) { [0]=> object(stdClass)#26 (1) { ["distance"]=> NULL } } 
[4]=> array(1) { [0]=> object(stdClass)#27 (1) { ["distance"]=> string(4) "26.7" } } 
[5]=> array(1) { [0]=> object(stdClass)#28 (1) { ["distance"]=> string(4) "42.2" } } 
[6]=> array(1) { [0]=> object(stdClass)#29 (1) { ["distance"]=> string(4) "32.3" } } 
[7]=> array(1) { [0]=> object(stdClass)#30 (1) { ["distance"]=> string(4) "10.9" } } } 

Мой главный вопрос - как я могу исправить код файла вида, чтобы правильно выводить числа в этом массиве. Однако, если бы я мог написать свою функцию по-другому, чтобы создать регулярный ассоциативный массив, я бы тоже хотел это знать!

Любая помощь была бы высоко оценена!

ответ

1

Это должен сделать трюк:

foreach ($sums_for_table as $entry) { 
     $distance = $entry[0]->distance; 
     echo $distance . ' <br />'; 
    } 

Вы можете получить доступ свойства StdClass объектов с помощью $ object-> свойства синтаксиса.

Я не знаю, как весь ваш код работает, потому что я не вижу все это, но для более чистого, как вы могли бы попробовать:

// controller 
$bikedata['sums_for_table'] = []; 
$weeknumbers = array(0, 1, 2, 3, 4, 5, 6, 7); 
foreach ($weeknumbers as $weeknumber) { 
    $weekResult = $this->bike_model->get_weekly_sum($weeknumber); 
    $bikedata['sums_for_table'][$weeknumber] = $weekResult[0]->distance; 
} 

// view 
foreach ($sums_for_tables as $weekNumber => $distance) { 
    // draw your table here 
} 
+1

Awesome, Gries. Спасибо! Теперь это работает отлично. Я пробовал что-то по строкам объекта $ object->, но я не знал, чтобы указать нулевой ключ. Моя таблица теперь отображается отлично, так что теперь, на следующий шаг, превратив это в гистограмму! И еще спасибо за более чистый код. Я собираюсь поиграть с этим и посмотреть, как это работает; выглядит как хороший способ еще раз использовать свойство $ object->, чтобы помочь его изучить. Те из нас, кто учится самостоятельно, действительно ценят вдумчивые ответы, такие как ваши! – Cyclist

+0

Альтернативный код изначально генерировал сообщение об ошибке «пытается получить свойство nonobject». Затем я добавил ключ от нуля, и он отлично поработал! Таким образом, последняя строка кода контроллера становится: $ bikedata ['sums_for_table'] [$ weeknumber] = $ weekResult [0] -> distance; – Cyclist

Смежные вопросы