Jump to content
Sign in to follow this  
marcus

Iteration Problem: Insert Element Every nth Loop

Recommended Posts

Hi there,

for some reason I do not succeed in doing a simple iteration (in this case with images):


<?php 
 
$number_of_images = count($pages->get(1012)->images);
 
 
    foreach($pages->get(1012)->images as $image) {
        $thumbnail = $image->size(118,112);
        echo "<a href='{$image->url}'><img class='photo' src='{$thumbnail->url}' alt='{$image->description}' /></a>";
    if ($number_of_images % 3 == 0) { echo "<p>Insert</p>";}
 
    }
 
?>
 
In this case, there a 5 images attached to 1012, if I echo $number_of_images inside the foreach loop it prints "5". But on the other hand this variable doesn't react on my "$number_of_images % 3 == 0", meaning that it does not insert the <p>...-Chunk every 3 images.
 
Can you help me to find the error in my approach or code? :)
 
Thanks in advance!
marcus 

Share this post


Link to post
Share on other sites


Been fighting the WYSIWYG editor. 
I usually do something like this:
$index = 0;
foreach($data as $value)
{
    echo "Index: $index\n";
    if ($index % 3 == 0)
    { 
        // do stuff here
    }

    // Add 1 to the index variable 
    $index++;
   
}

You get the picture :)

  • Like 1

Share this post


Link to post
Share on other sites

Welcome to the forums Marcus

Your $number_of_images variable will always hold the same value (in this case 5), so the result of the module 3 test will always be false. What you have to do is forget about the images count (you don't really need it for this), and use a simple counter for the loop. With this change, your code would look like this: 

<?php 
 
//$number_of_images = count($pages->get(1012)->images); <- no need for this
 
$i = 1; // <- the counter starts with 1
 
foreach($pages->get(1012)->images as $image) {
    $thumbnail = $image->size(118,112);
    echo "<a href='{$image->url}'><img class='photo' src='{$thumbnail->url}' alt='{$image->description}' /></a>";
    if ($i % 3 == 0) { echo "<p>Insert</p>";} // <- the module test is made against the counter
    i++; // <- update the counter on each iteraction
}
 
?>
 
PS: use the code tag on the editor when writing code. It will look much nicer :)
  • Like 2

Share this post


Link to post
Share on other sites

Arjen, 0 % 3 = 0, you want to insert the <p> on the first image? ;)

Share this post


Link to post
Share on other sites

Thank you very much, diogo and arjen! :)

Concerning the Code editor: I tried it first, but the post preview populated the php-code with divs and spans all over (though I was pasting it from SublimeText) - anyway...

Share this post


Link to post
Share on other sites

You're welcome. Yep also happened to me the problem with the code after posting the first time, but it was corrected after editing and saving again...

@Pete, sorry to bother you again with this, but the forum is acting a little crazy :(

Share this post


Link to post
Share on other sites
Arjen, 0 % 3 = 0, you want to insert the <p> on the first image? ;)

:)

I should've typed it in an editor, but instead I've been copying and pasting in the WYSINWYG editor.

Share this post


Link to post
Share on other sites

What browser/OS are people experiencing editor issues on?

Share this post


Link to post
Share on other sites

chrome dev here (giving it another thought, i can't really complain, right?)

Share this post


Link to post
Share on other sites

Me too. Chrome Canary.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Marvin
      Hello, i want to ask, i maintain a website that using a processwire and php, and i want to make an archive at my website using a subfolder system, but when i try,
      the sebfolder is show but when i click the files in that subfolder not show, and my browser just show me an error Invalid argument supplied for foreach(), i don't know why it error
      Here i attach my code and my screenshoot website :
      This is my code

      This is result of my website

      This is my error

       
       
    • By Mithlesh
      Hi there,
      My form is not getting submitted, it is showing:
      Unable to verify successful email delivery of this form submission.
      Attaching for your reference as well: 

      In the Backend, it is showing Connection timed out with smtp.gmail.com
      Pl guide me how to resolve that
    • By CareerTeam GmbH
      Hi there,
      We are an executive search agency based in Germany looking for a freelancer (2-5 days per week) supporting us with the development and design of our websites. The position will be located in Hamburg, Germany and it would be great if you are on short call. German language knowledge is mandatory. 
      You can reach me via email jobs@careerteam.de.
      Thank you!
      Regards
      Annemie
    • By louisstephens
      I was really unsure of how to actually title this post, so I do apologize (if someone has a better idea, I will gladly edit it). I am using the profields: pagetable field to allow people to create their own "content" (copy, image, button, etc etc) and rearrange it. I also included a field called "column_size" using the RangeSlider set to (1-12).
      I guess I'll clarify a bit more on this. I am using flexbox where the "row" is <section></section> and the columns are <div class="column"></div> have given the "columns"  flex: 1 1 0; so no matter how many columns you have, the columns will automatically adjust for new content. Where my confusion is coming in: If a user has set up 3 copy items (with 12, 5, 7 respectfully for the column_size), how do I actually output this in my template? I was going to use a switch statement to handle the various items which I thought made it quite easy, but with closing sections and columns I have confused myself as I assume I need an if statement to check if the column size is > 12, or = 12 to determine the actual closing/opening of sections. I apologize if I have not made this very clear. I am a bit unsure how to word this let alone to go about this. 
      Im very appreciative of for any insight into this.
       
       
    • By louisstephens
      So I have been hard at work creating url segments for a template (api) and everything is working swimmingly in creating a simple end point for svelte.js. I have however, run into a few questions that I can wrap my head around.
      In my api template I have:
      if($input->urlSegment1 === 'clients') { header('Content-Type: application/json'); $clients = $pages->find("template=clients"); $client_array = array(); foreach ($clients as $client) { $id = $client->id; $title = $client->title; $url = $client->url; $clientName = $client->client_name; $clientColor = $client->client_color->value; $assigned = $client->assigned_to->user_full_name; $client_array[] = array( 'id' => $id, 'code' => $title, 'name' => $clientName, 'associated_users' => $assigned, 'url' => $url ); } $client_json = json_encode($client_array, true); echo $client_json; } The output json from this is:
      [ { "id":1644, "code":"abc", "name":"Test Name", "associated_users":null, "url":"\/pw\/clients\/abc\/" }, { "id": 1645, "code": "xyz", "name": "Test Name", "associated_users": null, "url": "\/pw\/clients\/xyz\/" }, ] I was curious is it possible to add in "clients" before this output json so it would appear as 
      clients: [ { "id":1644, "code":"abc", "name":"Test Name", "associated_users":null, "url":"\/pw\/clients\/abc\/" }, { "id": 1645, "code": "xyz", "name": "Test Name", "associated_users": null, "url": "\/pw\/clients\/xyz\/" }, ] I was not really sure of how to tackle this in my php code, and have spent more time than I care to admit trying to figure it out. Another question I have is that "associated_users" is returning null, which in this instance is correct. It is a multi page field that is set to pull a custom name field from the users template, ie "Louis Stephens" would be associated with the first page. I understand that I need to use a foreach to get the correct data, but I was really unsure of how to place this inside an array, or update the array with the new data. Any help with any of this would greatly be appreciated.
×
×
  • Create New...