|
next
Advance the internal array pointer of an array
(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1 xmlreader:1.0-1.0.1)
Example 317. Example use of next() and friends<?php Related Examples ( Source code ) » next Examples ( Source code ) » Cookie based login form and get last login time Examples ( Source code ) » Array element navigation Examples ( Source code ) » current Examples ( Source code ) » next Advance the internal array pointer of an array Examples ( Source code ) » key: Fetch a key from an associative array Examples ( Source code ) » Choosing watermark color based on the background luminosity Examples ( Source code ) » Animated Talking Captcha php class Examples ( Source code ) » Flash video example using very simple .flv Examples ( Source code ) » Drawing curve in SWF whith PHP Examples ( Source code ) » Create a swf slideshow Examples ( Source code ) » Search the Web using Google API Examples ( Source code ) » E-mail address validation class Examples ( Source code ) » Calling PL/SQL Procedures and Functions Examples ( Source code ) » PHP and .NET - Image Rotation Example using C# and PHP Code Examples / Notes » nexttino
this may be handy and i didnt know where else to post it.. i need a simple function to cycle through an array i eventually made it into a class so i could have multiple cycles.. if you like it or find it usefull please email me and let me know class Cycle { var $position; var $dataArray; var $dataArrayCount; function Cycle() { $this->dataArray = func_get_args(); $this->dataArrayCount = count($this->dataArray); } function Display() { $this->position = (!isset($this->position) || $this->position >= ($this->dataArrayCount - 1)) ? 0 : $this->position += 1; return $this->dataArray[$this->position]; } } $bgColor = new Cycle('#000000', '#FFFFFF', '#FF0000'); echo $bgcolor->Display(); //returns #000000 echo $bgcolor->Display(); //returns #FFFFFF echo $bgcolor->Display(); //returns #FF0000 echo $bgcolor->Display(); //returns #000000 lukasz
This function will return the previous,next neighbors of an array entry within an associative array. If the specified $key points to the last or first element of the array, the first or last keys of the array will be returned consecutively. This is an improved version of the same function posted earlier. <?php function array_neighbor($arr, $key) { $keys = array_keys($arr); $keyIndexes = array_flip($keys); $return = array(); if (isset($keys[$keyIndexes[$key]-1])) { $return[] = $keys[$keyIndexes[$key]-1]; } else { $return[] = $keys[sizeof($keys)-1]; } if (isset($keys[$keyIndexes[$key]+1])) { $return[] = $keys[$keyIndexes[$key]+1]; } else { $return[] = $keys[0]; } return $return; } ?> court shrock
This code returns neighbors of the specified key. The result will be empty if it doesn't have any neighbors. My approach was to use the order of keys to determine neighbors, which is differnet from just getting the next/previous element in an array. Feel free to point out stupidities :) <?php function array_neighbor($arr, $key) { krsort($arr); $keys = array_keys($arr); $keyIndexes = array_flip($keys); $return = array(); if (isset($keys[$keyIndexes[$key]-1])) $return[] = $keys[$keyIndexes[$key]-1]; if (isset($keys[$keyIndexes[$key]+1])) $return[] = $keys[$keyIndexes[$key]+1]; return $return; } ?> bm
Take care when replacing code using reset()/next() with code using foreach as foreach does not update the array's internal pointer. This means you cannot, say, use next() to skip an element in foreach loop, or use current() within a function to get a reference to the current element. You probably have code depending on this internal pointer and replacing it will be more work than you anticipated. See http://www.php.net/foreach brentimus
Papipo's function below is usefull in concept but does not work. "Since you do not pass the array by reference, its pointer is only moved inside the function." This is true, but the array you are manipulating in your has_next() function will have it's pointer set to the first element, not the same position as the original array. What you want to do is pass the array to the has_next() function via reference. While in the has_next() function, make a copy of the array to work on. Find out the current pointer position of the original array and set the pointer on the working copy of the array to the same element. Then you may test to see if the array has a "next" element. Try the followig insetad: <?php function has_next(&$array) { $A_work=$array; //$A_work is a copy of $array but with its internal pointer set to the first element. $PTR=current($array); array_set_pointer($A_work, $PTR); if(is_array($A_work)) { if(next($A_work)===false) return false; else return true; } else return false; } function array_set_pointer(&$array, $value) { reset($array); while($val=current($array)) { if($val==$value) break; next($array); } } ?> gpatmore
If your using a foreach loop, unless you for a reference, PHP will make a copy of the array to use it the loop. So, when I need to take a different action for the last element in the array I use the following: <?php $ary = explode(',','a,b,c,d,e,f,g'); foreach($ary as $a){ print 'letter ' . $a; if(next($ary)){ print ' '; }else{ print ' dun!'; } } ?> Output: letter a letter b letter c letter d letter e letter f letter g dun! NOTE:: PHP5 has added an ability to reference the variable in a foreach like: <?php foreach($ary as &$a){} ?> this will probably cause undesired results when using the method above. also if the array is changed in any way as to cause the length of the original array to become different then the copy, it will not work. Consider the following example: <?php $ary = explode(',','a,b,c,d,e,f,g'); foreach($ary as $a){ print 'letter ' . $a; if(next($ary)){ unset($ary[count($ary) - 1]); print ' '; }else{ print ' dun!'; } } ?> output: letter a letter b letter c letter d dun!letter e dun!letter f dun!letter g dun! sigmar
If you want to check, if there are some more elements in array after given key, you can use the following function: function more_array_keys($keyname, &$array) { if (!is_array($array)) { return false; } if (empty($keyname)) { return false; } $set = false; $count = 0; foreach ($array as $key => $value) { if ($set === true) { $count++; } if ($key == $keyname) { $set = true; } } return $count > 0 ? true : false; } tom
I see some questions like "how can I know if an array has a next value without changing its internal pointer" and some pretty complicated responses that DO work mind you and in some cases you'll need them... But suppose you just need a different action within a foreach loop when reaching the final item: (it won't be usefull in every situation, but in most it will) $numOfItems = count($someArray); $counter = 0; foreach ($someArray as $key => value){ $counter += 1; if ($counter <> $numOfItems){ //here all next items exist } else { //final item } } papipo's gmail account
I need to know if an array has more items, but without moving array's internail pointer. Thats is, a has_next() function: <?php function has_next($array) { if (is_array($array)) { if (next($array) === false) { return false; } else { return true; } } else { return false; } } $array = array('fruit', 'melon'); if (has_next($array)) { echo next($array); } // prints 'melon' ?> Since you do not pass the array by reference, its pointer is only moved inside the function. Hope that helps. gg2005
Don't confuse next with continue! If you're a Perl developer starting with PHP, you might try to use "next" inside a loop to skip to the next iteration... i.e., foreach ($things as $thing) { if (something I don't like about $thing) { next; } blah.... } The php compiler will take next... but it's not going to work. Do this instead: foreach ($things as $thing) { if (something I don't like about $thing) { continue; } blah.... } sigmar
And if you want to know if there are any array elements in array before given key, you can use this function: function any_array_keys_before($keyname, &$array) { if (!is_array($array)) { return false; } if (empty($keyname)) { return false; } $set = false; $count = 0; foreach ($array as $key => $value) { if ($set === false && $key != $keyname) { $count ++; } else if ($key == $keyname) { $set = true; } } return $count > 0 ? true : false; } |
Change Languagearray_change_key_case array_chunk array_combine array_count_values array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_diff array_fill_keys array_fill array_filter array_flip array_intersect_assoc array_intersect_key array_intersect_uassoc array_intersect_ukey array_intersect array_key_exists array_keys array_map array_merge_recursive array_merge array_multisort array_pad array_pop array_product array_push array_rand array_reduce array_reverse array_search array_shift array_slice array_splice array_sum array_udiff_assoc array_udiff_uassoc array_udiff array_uintersect_assoc array_uintersect_uassoc array_uintersect array_unique array_unshift array_values array_walk_recursive array_walk array arsort asort compact count current each end extract in_array key krsort ksort list natcasesort natsort next pos prev range reset rsort shuffle sizeof sort uasort uksort usort |