Improve company productivity with a Business Account.Sign Up

x
?
Solved

codeigniter loop result inside loop

Posted on 2014-12-08
9
Medium Priority
?
2,328 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 46

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
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 46

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
 

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 46

Accepted Solution

by:
Chris Stanyon earned 2000 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 46

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

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

I recently worked on a Wordpress site that utilized the popular ContactForm7 (https://contactform7.com/) plug-in that only sends an email and does not save data. The client wanted the data saved to a custom CRM database. This is my solution.
Laravel is the most sought after web development framework. It comes with ample amount of features that make it easy for developers to work around it. Know about its features in detail.
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.

579 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