Jump to content
westman

skipping a loop or two in a while loop

Recommended Posts

Hi all,
I would like to escape a loop if $mainRow's value has already been called.
Here is what I have but it is not working.

while ($stmt->fetch()) {
$mail_main[] = $mainRow;

$main_arr .= ''.$main_arr.', '.$mainRow.'';
$main_arr_array = explode(",", $main_arr);
if (in_array($mainRow, $main_arr_array, TRUE)){
continue;
//break;
}
}

 

Edited by westman

Share this post


Link to post
Share on other sites

If you want to exit the loop you can use break instead of continue.

That code is pretty weird though.  Why do you concatenate everything in a string and then explode to an array, why not just add the new value to the array?  Also, wouldn't that in_array check always be true, because you just added it to the array right before checking?

Share this post


Link to post
Share on other sites

thank you.
I didn't see that.
I have updated my code

$main_arr_array = explode(",", $main_arr);
if (in_array($mainRow, $main_arr_array, TRUE)){
continue;
//break;
}
$main_arr .= ''.$mainRow.', ';

echo $main_arr;

This is the result...
5, 6, 5, 4, 3, 2, 1,
I only want one 5 to show.
How do I skip the loop?

Edited by westman

Share this post


Link to post
Share on other sites

Use temporary empty array $tmparray, and check through each value to check that the value is not in array !in_array() ($tmparray), if not, then add to the $tmparray.

At the end

echo implode(", ",$tmparray);

Share this post


Link to post
Share on other sites

I have updated the code once more...

$main_arr = '';
$main_arr_array = "";
// code
while ($stmt->fetch()) {
$mail_main[] = $mainRow;

$main_arr_array = explode(",", $main_arr);
if (in_array($mainRow, $main_arr_array, TRUE)){
continue;
//break;
}else{
$main_arr .= ''.$mainRow.', ';
//$main_arr .= implode(", ",$mainRow);
//$tmparray = implode(", ",$tmparray);
}

}


I am still not getting the skip.
Could you give a code example please?
 

Share this post


Link to post
Share on other sites

You should not be using strings for this operation, work with arrays and then convert the result to a string (if necessary) when you're done.

I also recommend using a set rather than a list to check for duplicate items. A set is a data structure where the item itself is its own identifier. Finding an item in a set is much faster than searching for it in a list.

$already_used = []; // This is a set
$list = []; // This is a list

// Loop through results
while($row = $stmt->fetch()) {

  // Make sure that the item is not already in the set
  if(!isset($already_used[$row])) {

    // Add the item to the set
    $already_used[$row] = true;

    // Add the item to the list
    list[] = $row;

  }
}

// If necessary, convert the result into a comma-separated string
$output = implode(',', $list);

 

Share this post


Link to post
Share on other sites
        $uniqueValueArray = [];
        while($row = $stmt->fetch()) {

            if (!in_array($row, $uniqueValueArray)) {
                $uniqueValueArray[] = $row;
            }
        }

        echo implode(', ', $uniqueValueArray);

 

Share this post


Link to post
Share on other sites

thank you very much for the examples.
I am not sure I am using them right in my code.
 

while ($stmt->fetch()) {
$mail_main[] = $mainRow;

//$uniqueValueArray = []; this alone shows an error in Dreamweaver
$uniqueValueArray [] = $mainRow;
while($row = $stmt->fetch()) {

if (!in_array($row, $uniqueValueArray)) {
$uniqueValueArray[] = $row;
}
}

} // END while ($stmt->fetch()) {
echo implode(', ', $uniqueValueArray);

What am I doing so wrong?

Edited by westman

Share this post


Link to post
Share on other sites

IF $mainRow represents a single variable value then

$uniqueValueArray = []; // this is now the normal way of declaring a array variable since PHP 5.4
while ($stmt->fetch()) {

if (!in_array($mainRow, $uniqueValueArray)) {
$uniqueValueArray[] = $mainRow;
}

} // END while ($stmt->fetch())

echo implode(', ', $uniqueValueArray);

 

  • Like 1

Share this post


Link to post
Share on other sites

Dsonesuk,
Thank you.
Here is my new code


$uniqueValueArray = [];

while ($stmt->fetch()) {
$mail_main[] = $mainRow;

if (!in_array($mainRow, $uniqueValueArray)) {
$uniqueValueArray[] = $mainRow;
}else{
continue;
}

} // END while ($stmt->fetch()) {
echo implode(', ', $uniqueValueArray);


It seems to work well.
Is there any way I can remove the error Adobe DW is showing me with $uniqueValueArray = []; ?

Share this post


Link to post
Share on other sites

Yeah! simple don't use it! or get a version that don't report it as an error, as I said, its totally valid since php version 5.4 and since where up to php version 7 now! It should accept this as valid.

Share this post


Link to post
Share on other sites

The 'continue' is not required, it does nothing, as all the values will be looped through, and does nothing with values added to arrays.

Share this post


Link to post
Share on other sites

without

else{
continue;
}


my code pulls out duplicates from the database.
my code only works correctly with "continue;" in place.
 

Share this post


Link to post
Share on other sites

Only from this

$mail_main[] = $mainRow;

because its not filtering duplicates, if you want that filtered change all '$uniqueValueArray' to '$mail_main'

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

×