PHP - How To Prevent Appending Same Property Twice In Array In Nested Foreach
Hey all,
I have two objects that contain object instances. I want to compare the properties of the instances and if the old_parent's property doesn't exist as one of the $new_parent's property, then I place the old_parent's property in an array called unneeded_ids. Problem is when I use nested foreach to loop through the instances of the two objects, despite old_parent having only one instance with a property id of 1, because it loops twice, the array gets two "1" values rather than just one: Code: [Select] public function update(){ $vanity_url = new VanityUrl(); $vanity_url->where('user_id',$this->current_user()->id)->get(); $zones = $this->input->post('zones'); $zone = new Zone(); $zone->where_in('name', $zones)->get(); $subcategory = new Category(); $subcategory->where('id',$this->uri->segment(4))->get(); $old_parents = new Category(); $old_parents = $subcategory->related_category->get(); $unneeded_ids = array(); if(!$this->input->post('catupload')){ if($subcategory->save($zone->all)){ redirect("blogs/$vanity_url->url/categories"); } else { echo "Error occurred. Please try again."; } } else { $new_parents = new Category(); $controller = $this->input->post('catupload'); $new_parents->where_in('controller',$controller)->get(); foreach($new_parents as $new){ foreach($old_parents as $old){ if($new->id != $old->id){ array_push($unneeded_ids, $old->id); } } } var_dump($unneeded_ids); } } The var_dump outputs: Code: [Select] array(4) { [0]=> int(126) [1]=> int(127) [2]=> int(126) [3]=> int(127) } but it should only output: Code: [Select] array(2) {[0]=> int(126) [1]=> int(127)} That's because there's only one object instance of old_parent that has a property id value of 126 and the same for 127. The nested for each loop is causing it to iterate twice against the same object and sticking it into the array. How do I get desired result? Thanks for response. Similar TutorialsHello. I'm trying to append the loop keys and values into a string and store it into a hidden field. This is the code I have : Code: [Select] if (isset($_POST['ordered'])) { // We can assign $_POST['product'] to a variable to make it easier to type out $prod = $_POST['product']; // Throw a little intro to see how many they checked echo 'You selected ' , count($_POST['ordered']) , ' products.'; // Now we loop through it and get the IDS that were selected // Foreach lets you select the $key and the $value for each iteration of the loop // $strOrder = ""; foreach ($_POST['ordered'] as $key=>$id) { echo '<p/> ProdName: ' , $prod[$id]['name'] , '<br/> ProdPrice: ' , $prod[$id]['price'] , '<br/> ProdQty: ' , $prod[$id]['qty'] , ' <hr/>'; $strOrder .= $key . " " . $id; $TOT += $prod[$id]['price'] * $prod[$id]['qty']; } $TOT2 = $TOT + 55; echo '<input type="hidden" Name="TOT" value ="'. $TOT .'">'; echo '<input type="hidden" name="TOT2" value =". $TOT2 .'">'; echo '<input type="hidden" name="Order" value=". $strOrder . '">'; } strOrder does not get set to a value. Hi all I am trying to loop through an array and output as JSON. What I'm looking to do is create something like: Code: [Select] "something": [ {"title":"Test 1"}, {"title":"Test 2"} ], Notice that the final row has no comma. My code is as follows: <?php foreach($something as $thing): ?> <?php $something_array = array('title'=>$thingt->getId()); ?> <?php echo json_encode($something_array).','."\n"; ?> <?php endforeach; ?> I had to add a comma to the end of the array, or the JSON rows would not be ended with one. How can I get it so that, no matter how many items are in the array, the last row, wil not have the comma at the end? With the comma at the end, my JSON doesn't validate Thanks [/code] Hi, I'd like to know what the best way of breaking out of a nested foreach loop is..but not breaking out of the first foreach ears the code like, Code: [Select] foreach ($apts as $apt) { foreach($rdb as $rem) { // Check to see if we've already sent a reminder for this appointment if($apt->id == $rem->appid) { // TODO get out of this foreach and go to the next iterartion of the first foreach } } //rest of 1st foreach code here } is there some syntax i can put at the first foreach eg [here] and reference it within the second foreach continue[here]; or something? thanks, I'm not sure if the title explains it very well, but here is an image of it. I am trying to figure out how to access the option selected (equal, not equal, etc.), along with its input box, for each column (the checkboxes on the right) selected. The purpose of this is to allow a non-programming administrator user to create a custom query to access information. I can find out which checkboxes are selected no problem, but finding the accompanying drop-down option and input box is difficult for me. How do I do this? If you have a suggestion on how to change it, I'm very open. Thank you in advance! Code: [Select] if(!isset($_POST['submit'])) { echo " <form method='post'> <table> <tr> <td valign='top'>SELECT</td> <td valign='top'> <table>"; // LIST ALL COLUMNS IN A TABLE $result = mysql_query("SELECT * FROM table_name") or die(mysql_error()); $rowcount=mysql_num_rows($result); $y=mysql_num_fields($result); for ($x=0; $x<$y; $x++) { echo " <tr> <td> <input type='checkbox' name='fields[]' value='".mysql_field_name($result, $x)."'>".mysql_field_name($result, $x)." </td> </tr>"; } echo " </table> </td> <td valign='top'>FROM allocations</td> <td valign='top'>WHERE</td> <td> <table>"; // LIST ALL COLUMNS IN A TABLE $result = mysql_query("SELECT * FROM table_name") or die(mysql_error()); $rowcount=mysql_num_rows($result); $y=mysql_num_fields($result); for ($x=0; $x<$y; $x++) { echo " <tr> <td> <input type='checkbox' name='column[]' value='".mysql_field_name($result, $x)."'>".mysql_field_name($result, $x)." </td> <td> <select name='operator[]'> <option value='='>equals</option> <option value='<>'>does not equal</option> <option value='>'>greater than</option> <option value='<'>less than</option> <option value='>='>greater than or equal to</option> <option value='<='>less than or equal to</option> <option value='LIKE'>is like</option> </select> </td> <td><input type='text' name='criteria[]'></td> </tr>"; } echo " </table> </td> <td valign='top'><input type='submit' value='Process Query' name='submit' class='submit'></td> </tr> </table> </form>"; } else { echo "<b>Fields to edit:</b> "; foreach ($_POST['fields'] as $fields) { echo $fields,", "; } echo "<br><br>"; echo "<b>Columns to query:</b> "; foreach ($_POST['column'] as $columns) { echo $columns," HERE IS THE SPOT, "; } } I'm trying to prevent the reinsertion of data if a user refreshes a page. Tried using header() to take them to a new page but I'm using sessions, and it gives an error. Now I'm doing a basic check to see if the field exists before insert... but I'm inserting arrays. Not sure if I've got this right. Would this work. Code: [Select] if(sizeof($_POST['fname'])) { // loop through array $number = count($fname); for ($i=0; $i<$number; $i++) { $fnames = $fname[$i]; $lnames = $lname[$i]; $phones = $phone[$i]; $emails = $email[$i]; $bdates = $bdate[$i]; $bdates2 = $bdate2[$i]; $bdates3 = $bdate3[$i]; $wids = $wid[$i]; $rids = $rid[$i]; $number_of_rows = mysql_num_rows(mysql_query("SELECT * FROM tbl_attendees WHERE attendee_fname='$fnames' AND attendee_lname='$lnames' AND attendee_registrationid='$rid'")); if($number_of_rows > 0) { // nothing to do. Just want to reload the page without running query insert } else { $query_insertItemWorkshop = "INSERT INTO tbl_attendees (attendee_fname, attendee_lname, attendee_registrationid, workshop_id, attendee_email, attendee_telephone, attendee_bday, attendee_bmonth, attendee_byear) VALUES ('$fnames', '$lnames', '$reg_alone', '$wids', '$emails', '$phones', '$bdates', '$bdates2', '$bdates3')"; $dberror = ""; $ret = mysql_query($query_insertItemWorkshop); } <!-- rest of page --> Hello everyone, I'm trying to pull a list of email campaigns from constant contact and display them on our site, require_once('ctctWrapper.php'); $data = new CampaignsCollection(); $campaigns = $data->listCampaigns(); foreach ($campaigns as $campaign) { foreach ($campaign as $value) { $feed .= $value . "\r\n"; } } echo $feed; The above code gives me the following error Quote Catchable fatal error: Object of class Campaign could not be converted to string in /home/******/public_html/tmpl/default.php on line 13 If I just print the array, this is how it starts out Code: (xml) [Select] Array ( [0] => Campaign Object ( [campaignName:private] => SimpleXMLElement Object ( [0] => aaaCopy of March 2011 Newsletter ) [id:private] => SimpleXMLElement Object ( [0] => http://api.constantcontact.com/ws/customers/******/campaigns/1105174741613 ) [link:private] => SimpleXMLElement Object ( [0] => /ws/customers/******/campaigns/1105174741613 ) [status:private] => SimpleXMLElement Object ( [0] => Draft ) [campaignDate:private] => SimpleXMLElement Object ( [0] => 2011-04-14T17:07:23.245Z ) [lastEditDate:private] => [campaignSent:private] => [campaignOpens:private] => [campaignClicks:private] => [campaignBounces:private] => [campaignForwards:private] => [campaignOptOuts:private] => [campaignSpamReports:private] => [subject:private] => [fromName:private] => [campaignType:private] => [vawp:private] => [vawpLinkText:private] => [vawpText:private] => [permissionReminder:private] => [permissionReminderText:private] => [greetingSalutation:private] => [greetingName:private] => [greetingString:private] => [orgName:private] => [orgAddr1:private] => [orgAddr2:private] => [orgAddr3:private] => [orgCity:private] => [orgState:private] => [orgInternationalState:private] => [orgCountry:private] => [orgPostalCode:private] => [incForwardEmail:private] => [forwardEmailLinkText:private] => [incSubscribeLink:private] => [subscribeLinkText:private] => [emailContentFormat:private] => [emailContent:private] => [textVersionContent:private] => [styleSheet:private] => [lists:private] => Array ( ) [fromEmailAddress:private] => [fromEmailAddressLink:private] => [replyEmailAddress:private] => [replyEmailAddressLink:private] => [archiveStatus:private] => [archiveUrl:private] => ) [1] => Campaign Object ( [campaignName:private] => SimpleXMLElement Object ( [0] => March 2011 Newsletter ) [id:private] => SimpleXMLElement Object ( [0] => http://api.constantcontact.com/ws/customers/******/campaigns/1104754710085 ) [link:private] => SimpleXMLElement Object ( [0] Hi guys,
Having trouble trying to show values from my $friend array. Only the first friend code is being displayed in my output.
There are several fields in my mysql associated with the $sql.
Any ideas?
Thanks
$sql = "SELECT * FROM friends WHERE Code = '$code' OR FriendCode = '$code' AND Status ='A'"; $result = mysqli_query($cxn,$sql) or die ("Can't get friends."); $friend = array(); while($row=mysqli_fetch_array($result)) { if($code == $row['FriendCode']) { $friend[] = $row['Code']; } elseif($code == $row['Code']) { $friend[] = $row['FriendCode']; } foreach($friend as $key => $value) { echo $value.'<br />'; } Edited by unistake, 18 June 2014 - 06:13 AM. What I' trying to do is take my array Code: [Select] $stores = array("name"=>"$MktName","address"=>"$address"); And for each each value, insert it into my db Code: [Select] foreach($stores as $k => $v){ mysql_query("INSERT INTO stores (name, address) VALUES('$k', '$v' ) ") or die(mysql_error()); } Now, I'm just learning more about arrays, and this is obviously wrong How do I go about getting the value of "name"? It pulls the value for "address". Thanks in advance Hi, I have an array: Code: [Select] Array ( [0] => index.php [1] => Home [2] => page.php?id=23 [3] => Page ) How would I loop through it so I can link the previous value to the next value within the array e.g.: Code: [Select] <a href="index.php">Home</a> <a href="page.php?id=23">Page</a> I have the following foreach statement that gets the error msg's from the array called errors. However for the last key in the array, i would not like the <br /> to be echo'd out. How can I achieve that? Code: [Select] foreach ($errors as $msg) { echo $msg; echo "<br />"; } I got this already, my problem is I can't get all values of my $prog array because of '=>' operator. Is there any way to get rid of this? Code: [Select] foreach ($_POST['course'] as $val =>$course) { $prog = $_POST['program'][$val] ; echo $course; echo $prog; } I want to create a loop foreach [@attributes] I seem to be stuck and cant figure it out. any info would be helpful. Thanks! Code: [Select] Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 5760861 ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 5335615 ) ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 6080572 ) ) [3] => SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 5178898 ) ) ) I am a beginner, so forgive me all to whom this is trivial... I have an array, generated from simpleXML object, trying to parse... The array is not symmetrical & I am having trouble finding the right code to make it work. Help & comments are welcomed.. Here is the raw array with print_r: Code: [Select] Array ( [Area] => Array ( [0] => Array ( [Name] => Basement [Id] => 1 [Room] => Array ( [0] => Array ( [Name] => Equipment [Id] => 1 ) [1] => Array ( [Name] => Theater [Id] => 9 ) [2] => Array ( [Name] => Wine Cellar [Id] => 10 ) ) ) [1] => Array ( [Name] => 1st Floor [Id] => 2 [Room] => Array ( [0] => Array ( [Name] => Kitchen [Id] => 2 ) [1] => Array ( [Name] => Main Hall [Id] => 4 ) [2] => Array ( [Name] => Foyer [Id] => 8 ) [3] => Array ( [Name] => Stone Room [Id] => 14 ) [4] => Array ( [Name] => Garage Foyer [Id] => 16 ) [5] => Array ( [Name] => Dining Room [Id] => 17 ) [6] => Array ( [Name] => Living Room [Id] => 18 ) [7] => Array ( [Name] => Hearth Room [Id] => 19 ) [8] => Array ( [Name] => Office [Id] => 20 ) [9] => Array ( [Name] => Powder Room [Id] => 21 ) ) ) [2] => Array ( [Name] => 2nd Floor [Id] => 3 [Room] => Array ( [0] => Array ( [Name] => Landing [Id] => 7 ) [1] => Array ( [Name] => Master Bedroom [Id] => 11 ) [2] => Array ( [Name] => Nannys Room [Id] => 13 ) [3] => Array ( [Name] => East Kids Bed [Id] => 27 ) [4] => Array ( [Name] => West Kids Bed [Id] => 28 ) [5] => Array ( [Name] => Kids Bath [Id] => 29 ) [6] => Array ( [Name] => Robs Closet [Id] => 31 ) [7] => Array ( [Name] => Kelli's Office [Id] => 32 ) ) ) [3] => Array ( [Name] => 3rd Floor [Id] => 7 [Room] => Array ( [Name] => Bonus room [Id] => 5 ) ) [4] => Array ( [Name] => Outside Areas [Id] => 8 [Room] => Array ( [0] => Array ( [Name] => Veranda [Id] => 22 ) [1] => Array ( [Name] => Back Outdoor [Id] => 23 ) [2] => Array ( [Name] => Christmas Lights [Id] => 33 ) [3] => Array ( [Name] => Front Outdoor [Id] => 34 ) [4] => Array ( [Name] => Garage [Id] => 35 ) [5] => Array ( [Name] => Poolhouse Kitchen [Id] => 24 ) [6] => Array ( [Name] => Poolhouse Utility [Id] => 25 ) ) ) ) ) Here is the code: Code: [Select] foreach($xml2['Area'] as $v){ echo $v['Name'],' <br>'; foreach($v['Room'] as $v2){ echo ' ',$v2['Name'],' <br>'; } } Here is the result: Code: [Select] Basement Equipment Theater Wine Cellar 1st Floor Kitchen Main Hall Foyer Stone Room Garage Foyer Dining Room Living Room Hearth Room Office Powder Room 2nd Floor Landing Master Bedroom Nannys Room East Kids Bed West Kids Bed Kids Bath Robs Closet Kelli's Office 3rd Floor B 5 Outside Areas Veranda Back Outdoor Christmas Lights Front Outdoor Garage Poolhouse Kitchen Poolhouse Utility The problem lies with the "3rd Floor" which should contain "Bonus Room" as the room. I know that this is the only element that has no "Rooms" array, but I can't figure out how to code the trap for it. With this data, the condition could exist anywhere, not just my example, but I am stumped with the non symmetrical array that I am unfamiliar with. Any help? Thanks. --akaweed Hi everybody I am new to arrays, and loops pretty much, so please dont be mean! I am trying to turn a single upload form into a multiple upload form. My logic is I need to use arrays and loop the code for uploading the data from the form to the database (for each of these files, create a thumbnail, resize and rename original, move to folder, create path, and insert all that information into the db) But I have no idea how I've got this in the form (now) .... <pick an album to put the files into> <input type="file" name="image[]" > <input type="file" name="image[]" > and this is the code for the whole upload. It worked for single uploads ... but I'm now at a loss ... The code is abit messy, sorry. I'm fairly sure I need a foreach loop, but I dont know where to put it Really Really hoping you can help. Many thanks in advance Code: [Select] <?php ini_set("memory_limit","120M"); include ("DBCONNECT"); include ("CHECK ADMIN"); if ($admin != 1) { header("location:./login.php"); } else { define ("MAX_SIZE","5000"); define ("WIDTH","150"); define ("HEIGHT","100"); function make_thumb($img_name,$filename,$new_w,$new_h) { $ext=getExtension($img_name); if(!strcmp("jpg",$ext) || !strcmp("jpeg",$ext)) $src_img=imagecreatefromjpeg($img_name); if(!strcmp("png",$ext)) $src_img=imagecreatefrompng($img_name); $old_x=imageSX($src_img); $old_y=imageSY($src_img); $ratio1=$old_x/$new_w; $ratio2=$old_y/$new_h; if($ratio1>$ratio2) { $thumb_w=$new_w; $thumb_h=$old_y/$ratio1; } else { $thumb_h=$new_h; $thumb_w=$old_x/$ratio2; } $dst_img=ImageCreateTrueColor($thumb_w,$thumb_h); Imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y); if(!strcmp("png",$ext)) imagepng($dst_img,$filename); else imagejpeg($dst_img,$filename); imagedestroy($dst_img); imagedestroy($src_img); } function getExtension($str) { $i = strrpos($str,"."); if (!$i) { return ""; } $l = strlen($str) - $i; $ext = substr($str,$i+1,$l); return $ext; } $errors=0; if(isset($_POST['submit1']) && !$errors) { $sqlalbum="INSERT INTO album (album_name) VALUES ('$_POST[newalbumname]')"; mysql_query($sqlalbum) or die ('Error, album_query failed : ' . mysql_error()); } If(isset($_POST['Submit'])) { $image=$_FILES['image']['name']; // if it is not empty if ($image) { $filename = stripslashes($_FILES['image']['name']); $extension = getExtension($filename); $extension = strtolower($extension); if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png")) { echo '<h1>Unknown extension! You can only upload jpg, jpeg and png files</h1>'; $errors=1; } else { $size=getimagesize($_FILES['image']['tmp_name']); $sizekb=filesize($_FILES['image']['tmp_name']); //compare the size with the maxim size we defined and print error if bigger if ($sizekb > MAX_SIZE*1024) { echo '<h1>You have exceeded the size limit!</h1>'; $errors=1; } $image_name=time().'.'.$extension; $newname="uploads/".$image_name; $copied = copy($_FILES['image']['tmp_name'], $newname); if (!$copied) { echo '<h1>Copy unsuccessfull!</h1>'; $errors=1; } else { $thumb_name='uploads/thumbs/thumb_'.$image_name; $thumb=make_thumb($newname,$thumb_name,WIDTH,HEIGHT); }} }} If(isset($_POST['Submit']) && !$errors) { $album = $_POST['album']; $query = "INSERT INTO upload (name, path, album_id, thumbpath ) ". "VALUES ('$image_name', '$newname' , '$album', '$thumb_name')"; mysql_query($query) or die('Error, query failed : ' . mysql_error()); echo "<h1>Thumbnail created Successfully!</h1>"; echo '<img src="'.$thumb_name.'">'; } ?> I've never worked with multidimensional arrays. I have developed a calendar app. Right now i have it query the db for every day. So potentially 31 queries. Two part question: Would it be better(more "optimized") to query the db once to get all the events in that month for a certain calendar and put the rows into a multidimensional array and use php to determine which events to put in what days? And if that's the case, how do you cycle through the first key in an array like the following? I'm not even sure if this is the best way to structure the array. The number's represent the id number in the db and i will need to cycle through these. Code: [Select] $events = array ( "1"=>array ( "Bob's Birthday", "2011-05-24 16:30:0", "2011-05-25 12:00:00", ), "2"=>array ( "Day Off", "2011-05-27 08:30:0", "2011-05-28 17:00:00", ), "3"=>array ( "Pay rent", "2011-06-01 08:00:0", "2011-05-01 17:00:00", ) ); //something like this...maybe? foreach($events['first_key'] as $key => $value) { // not a clue how to reference the contents } Hello gurus, I've been pounding my head against the wall on this one. It must be something simple I'm missing. I have a text field that posts ($_POST['case_ids']) a comma separated value such as 10067,10076 When I use explode to break it up it should make it an array. However when I use it in a foreach loop I get an invalid argument error. If I do a check for is_array() it fails the check. If I print the array I get: Code: [Select] Array ( [0] => 10067 [1] => 10076 ) So I thought maybe I get the error because the individual array elements don't have commas between them so I wrote this to put commas in between each element except the last: Code: [Select] $cases = array(); $numItems = count($case_ids);//get count of array $i = 0;//initialize counter foreach($case_ids as $key => $value){ if($i+1 != $numItems) { $cases[$key] = $value.','; }else{ $cases[$key] = $value; }//end if $i+1 $i++; } However this new array still gets the invalid argument error. Are these not valid arrays? Any help would be greatly appreciated. Thanks in advance, Twitch I have this example php string: Code: [Select] $string = "@[item_1][door] @[mozart][grass] = yes @[mozart][green] = no @[mozart][human] @[blue][movie]=yes @[item_1][beat] = yes @[item_1][music] = no "; now $string idented just to easy view: Code: [Select] @[item_1][door] @[mozart][grass] = yes @[mozart][green] = no @[mozart][human] @[blue][movie]=yes @[item_1][beat] = yes @[item_1][music] = no I want to know how can i get this string ( or other string following this style ) and transform in an array that looks like: Code: [Select] Array ( [item_1] => Array ( [door] => Array ( [mozart] => Array ( [grass] => yes [green] => no [human] => Array ( [blue] => Array ( [movie] => yes ) ) ) ) [beat] => yes [music] => no ) ) What i tried I tried to use and recursive function to create an nested array but i can't have access to the array pointer ( in deep levels ) in recursive functions.. don't know why.. maybe is the wrong patch to the answer. thank you, I am having trouble understanding what this means: foreach($_SESSION['cart'] as $product_id => $quantity) I look forward to any responses in advance. I'm still pretty new to php and have an issue i'm trying to solve, I have the following two arrays
The first one is contains product id's and the quantity ordered
Array ( [35659] => 1 [35699] => 1 [35735] => 2 )The second one contains warehouse locations that stock the product and the quantity they have available Array ( [35659] => Array ( [9] => 10 [114] => 1 [126] => 0 ) [35699] => Array ( [9] => 8 [114] => 0 [126] => 5 ) [35735] => Array ( [9] => 10 [114] => 0 [126] => 0 ) )So what I am trying to do is loop through and add to an array each warehouse that meets the quantity of the order here is my code: $stockrequired = array('35659' => '1', '35699' => '1', '35735' => '2'); $instock = array(); foreach ($locations as $location) { foreach($stockrequired as $id => $qty){ if($stockavailable[$id][$location] >= $qty){ $instock[$id] = $location; } } } print_r($instock);However this produces the following which is the last warehouse that meets the quantity. Array ( [35659] => 114 [35699] => 126 [35735] => 9 )What I need is all the warehouses the meet the quantity for each product e.g. my desired outcome will be below. I'm guessing my loop is getting reset or something? Any help would be appreciated. Array ( [35659] => 9 [35659] => 114 [35659] => 9 [35699] => 126 [35735] => 9 ) |