Solved

codeigniter loop result inside loop

Posted on 2014-12-08
9
967 Views
Last Modified: 2014-12-10
Hi
I'm getting very confused and would appreciate some help.
I am returning book data that has chapter and verse fields (the Bible) and I would like to loop through each chapter and return all the verses from each particular chapter sorted by chapter.  What I have so far returns only the first verse from each chapter. You can see the results at:
http://www.imj.org.il/isaiah/book/homepage
Thanks
isaiah-mvc.txt
0
Comment
Question by:avir
  • 5
  • 4
9 Comments
 

Author Comment

by:avir
ID: 40486819
Here is how the db is set up.
db.gif
0
 
LVL 42

Expert Comment

by:Chris Stanyon
ID: 40487391
You're grouping on the Chapter, so you'll only get one record per chapter.

You'll need to run several loops on the database to get the records you need. First, select the Chapter records (grouped by Chapter), and then for each Chapter in the result set, query the database for the Verses. Add a new method to your model to get the verses based on Chapter:

public function get_verses($chapter)
{
    $this->db->select('*');
    $this->db->from('isaiah');
    $this->db->where('chapter', $chapter);
    $query = $this->db->get();

    if($query->num_rows() == 0) return false;
    return $query->result_array();
}

Open in new window


Then something along these lines:

$chapters = $this->book_model->get_chapters();
foreach ($chapters as $chapter) {
    $this->book_model->get_verses($chapter['chapter']);
}

Open in new window

0
 

Author Comment

by:avir
ID: 40487552
Okay thanks for your help.  I'll try this tomorrow. How does the get_verses function get the value for $chapter? This something that I don't quite get.
0
 
LVL 42

Expert Comment

by:Chris Stanyon
ID: 40487584
The function is defined with an argument called $chapter:

public function get_verses($chapter)

Open in new window


The function is then called with the chapter being passed in as an argument, which you get from inside your controller loop.

foreach ($chapters as $chapter) {
    $chapter->verses = $this->book_model->get_verses($chapter['chapter']);
}

 Also, one bit I'd missed was assigning the verses to the chapter so you can loop through them in the views.

Let me know if you get stuck - I've not given a copy / paste answer and you'll need to update your model, controller and view.
0
Easy Project Management (No User Manual Required)

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

Author Comment

by:avir
ID: 40488321
I almost got it. I am echoing the results in the controller, but I can't figure out how to move them over to the view.
This is my controller now.
    function homepage() 
	{
		$chapters = $this->book_model->get_chapters();
		foreach ($chapters as $chapter) {
			$verses= $this->book_model->get_verses($chapter['chapter']);
			echo $chapter['chapter']."<br>";
			foreach ($verses as $verse) {
			echo $verse['verseName']."<br>";
			echo $verse['text']."<br>";	
			echo "<br>";				
			}
		}			
		$this->load->view('book/homepage', $data);
    }

Open in new window

0
 
LVL 42

Accepted Solution

by:
Chris Stanyon earned 500 total points
ID: 40488506
OK. You just need to add the verses to the $data variable and then loop them in the view. I tend to use Objects instead of Arrays as I think it makes life a little easier. You'll need to change the result_array() to result() in your 2 models methods. Then something like this:

function homepage() 
{
     $data = new stdClass();
     $data->chapters = $this->book_model->get_chapters();
     foreach ($data->chapters as $chapter) {
          $chapter->verses = $this->book_model->get_verses($chapter->chapter);
     }

     $this->load->view('book/homepage', $data);
}

Open in new window


Then in your view:

<?php foreach ($chapters as $chapter): ?>
	<h2><?php echo $chapter->chapter ?></h2>
	
	<?php foreach ($chapter->verses as $verse): ?>
		<p><?php echo $verse->verseName ?><br><?php echo $verse->text ?></p> 		
	<?php endforeach; ?>

<?php endforeach; ?>

Open in new window

0
 

Author Closing Comment

by:avir
ID: 40488621
Great! Thanks for your help. Is there a difference between using Objects or Arrays other than what one might be used to?
0
 
LVL 42

Expert Comment

by:Chris Stanyon
ID: 40489104
For simple data collections, you can use arrays and objects in a similar way:

$data = new array();
$data['firstname'] = "chris";
echo $data['firstname'];

$data = new stdClass();
$data->firstname = "chris";
echo $data->firstname;

Open in new window


Codeigniter is heavily Object Oriented, so you may find yourself using objects more than you realise, and you'll soon see the benefit of using them.

For example, calling $query->result() in your model will return an array of Objects. These objects can be instantiated against a class, so as well as the column names being available, you can also add methods to your class and call them directly:

// Query the database and instantiate a User for each record
foreach ($query->result('User') as $row)
{
   // output a column name
   echo $row->firstname;
   // call a method
   echo $row->getFullName();
}

Open in new window

0
 

Author Comment

by:avir
ID: 40491516
Thanks for the explanation. It's a bit clearer now.
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Join & Write a Comment

Foreword (July, 2015) Since I first wrote this article, years ago, a great many more people have begun using the internet.  They are coming online from every part of the globe, learning, reading, shopping and spending money at an ever-increasing ra…
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to count occurrences of each item in an array.

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now