westman Posted March 29, 2018 Share Posted March 29, 2018 (edited) 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 March 29, 2018 by westman Link to comment Share on other sites More sharing options...
justsomeguy Posted March 29, 2018 Share Posted March 29, 2018 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? Link to comment Share on other sites More sharing options...
westman Posted March 29, 2018 Author Share Posted March 29, 2018 (edited) 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 March 29, 2018 by westman Link to comment Share on other sites More sharing options...
dsonesuk Posted March 29, 2018 Share Posted March 29, 2018 https://www.w3schools.com/php/func_array_unique.asp Link to comment Share on other sites More sharing options...
dsonesuk Posted March 30, 2018 Share Posted March 30, 2018 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); Link to comment Share on other sites More sharing options...
westman Posted March 31, 2018 Author Share Posted March 31, 2018 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? Link to comment Share on other sites More sharing options...
Ingolme Posted March 31, 2018 Share Posted March 31, 2018 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); Link to comment Share on other sites More sharing options...
dsonesuk Posted March 31, 2018 Share Posted March 31, 2018 $uniqueValueArray = []; while($row = $stmt->fetch()) { if (!in_array($row, $uniqueValueArray)) { $uniqueValueArray[] = $row; } } echo implode(', ', $uniqueValueArray); Link to comment Share on other sites More sharing options...
westman Posted April 1, 2018 Author Share Posted April 1, 2018 (edited) 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 April 1, 2018 by westman Link to comment Share on other sites More sharing options...
dsonesuk Posted April 1, 2018 Share Posted April 1, 2018 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); 1 Link to comment Share on other sites More sharing options...
westman Posted April 1, 2018 Author Share Posted April 1, 2018 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 = []; ? Link to comment Share on other sites More sharing options...
dsonesuk Posted April 1, 2018 Share Posted April 1, 2018 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. Link to comment Share on other sites More sharing options...
westman Posted April 1, 2018 Author Share Posted April 1, 2018 thank you so much. Link to comment Share on other sites More sharing options...
dsonesuk Posted April 1, 2018 Share Posted April 1, 2018 The 'continue' is not required, it does nothing, as all the values will be looped through, and does nothing with values added to arrays. Link to comment Share on other sites More sharing options...
westman Posted April 1, 2018 Author Share Posted April 1, 2018 without else{ continue; } my code pulls out duplicates from the database. my code only works correctly with "continue;" in place. Link to comment Share on other sites More sharing options...
dsonesuk Posted April 1, 2018 Share Posted April 1, 2018 Only from this $mail_main[] = $mainRow; because its not filtering duplicates, if you want that filtered change all '$uniqueValueArray' to '$mail_main' Link to comment Share on other sites More sharing options...
westman Posted April 3, 2018 Author Share Posted April 3, 2018 okay, works well. thank you. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now