|
Array FunctionsThese functions allow you to interact with and manipulate arrays in various ways. Arrays are essential for storing, managing, and operating on sets of variables. Simple and multi-dimensional arrays are supported, and may be either user created or created by another function. There are specific database handling functions for populating arrays from database queries, and several functions return arrays. Please see the Arrays section of the manual for a detailed explanation of how arrays are implemented and used in PHP. See also Array operators for other ways how to manipulate the arrays. The constants below are always available as part of the PHP core.
Sorting order flags:
Sorting type flags: used by various sort functions
See also is_array(), explode(), implode(), split(), preg_split(), and unset(). Table of Contents
Code Examples / Notes » ref.arraysebastian
xxellisxx at gmail dot com: see implode(), it does exactly what you want, but quicker. $array = array(); $string = implode( '', $array ); administrador ensaimada sphoera punt com
With this simple function you can convert a (partial) bidimensional array into a XHTML table structure: <?php $table = array(); $table[1][1] = "first"; $table[2][1] = "second"; $table[5][3] = "odd one"; $table[1][2] = "third"; echo matrix2table($table); function matrix2table($arr,$tbattrs = "width='100%' border='1'", $clattrs="align='center'"){ $maxX = $maxY = 1; for ($x=0;$x<100;$x++){ for ($y=0;$y<100;$y++){ if ($arr[$x][$y]!=""){ if ($maxX < $x) $maxX = $x; if ($maxY < $y) $maxY = $y; } } } $retval = "<table $tbattrs>\n"; for ($x=1;$x<=$maxX;$x++){ $retval.=" <tr>\n"; for ($y=1;$y<=$maxY;$y++){ $retval.= (isset($arr[$x][$y])) ?" <td $clattrs>".$arr[$x][$y]."</td>\n" :" <td $clattrs> </td>\n"; } $retval.=" </tr>\n"; } return $retval."</table>\n"; } ?> more scripts at http://www.sphoera.com psbrogna
Why is a deep copy function needed to move a sub array? I've just used the equality operator as in the code below. <?php $a= array( 'a'=>'apple', 'b'=>'banana', 'c'=>'cherry', 'subArray'=>array( 'A'=>'APPLE', 'B'=>'BANANA', 'C'=>'CHERRY' ) ); $a['copiedArray']= $a['subArray']; unset($a['subArray']); var_dump($a); ?> The above outputs the $a array with copiedArray being present and subArray gone. (php version: 4.4.0). shufty
when using Nimja's function, it was removing values that equaled 0, the following function counters this <?php function cleanArray($array) { foreach ($array as $key => $value) { if ($value == "") unset($array[$key]); } return $array; } ?> james churchman
very simple tip.. if you want an array's keys.. but not the values in it then this will do the trick $keys_only_array = array_flip(array_keys($origional_array_with_keys_and_values)); james mark lindeman
Very simple solution for changing the key of an associative array, of course it will fail in a lot of scenarios, but will do the trick in simple arrays: <?php function replace_key(&$input, $from_key, $to_key) { $input = unserialize(str_replace(':"'.$from_key.'";', ':"'.$to_key.'";',serialize($input))); } $array =array("a"=>1, "B"=>2, "c"=>3); replace_key($array, "B", "b"); print_r($array); ?> Output: Array ( [a] => 1 [b] => 2 [c] => 3 ) za
Updated functions for moving element between associative arrays using a numeric index. Sample: $a=array("04"=>"alpha",4=>"bravo","c"=>"charlie","d"=>"delta"); $b=array_move($a,4,2); Move element "bravo" after "delta" keeping keys. Old function probably goes wrong moving "alpha": caused by array_search that match numeric index 4 with "04" (string). Follow: <?php // array functions - 20/07/2006 12.28 if(!defined("ARRAY_FUNCS")) { // Swap 2 elements in array preserving keys. function array_swap(&$array,$key1,$key2) { $v1=$array[$key1]; $v2=$array[$key2]; $out=array(); foreach($array as $i=>$v) { if($i===$key1) { $i=$key2; $v=$v2; } else if($i===$key2) { $i=$key1; $v=$v1; } $out[$i]=$v; } return $out; } // Get a key position in array function array_kpos(&$array,$key) { $x=0; foreach($array as $i=>$v) { if($key===$i) return $x; $x++; } return false; } // Return key by position function array_kbypos(&$array,$pos) { $x=0; foreach($array as $i=>$v) { if($pos==$x++) return $i; } return false; } // Move an element inside an array preserving keys // $relpos should be like -1, +2... function array_move(&$array,$key,$relpos) { if(!$relpos) return false; $from=array_kpos($array,$key); if($from===false) return false; $to=$from+$relpos+($relpos>0?1:0); $len=count($array); if($to>=$len) { $val=$array[$key]; unset($array[$key]); $array[$key]=$val; } else { if($to<0) $to=0; $new=array(); $x=0; foreach($array as $i=>$v) { if($x++==$to) $new[$key]=$array[$key]; if($i!==$key) $new[$i]=$v; } $array=$new; } return $array; } define("ARRAY_FUNCS",true); } ?> 31-jan-2004 09:29
To remove an element from an array use unset(). Example: unset($bar['mushroomsoup']); aidan
To convert an array to a HTML table, see: http://aidanlister.com/repos/v/function.array2table.php PEAR also provides a simular package with many more features, http://pear.php.net/package/Var_Dump mo dot longman
to 2g4wx3: i think better way for this is using JSON, if you have such module in your PHP. See json.org. to convert JS array to JSON string: arr.toJSONString(); to convert JSON string to PHP array: json_decode($jsonString); You can also stringify objects, numbers, etc. phpnet_spam
Thought this might save someone a few hours. :) Feedback welcome, of course! Public domain, yadda yadda. function assocSort(&$array,$key) { if (!is_array($array) || count($array) == 0) return true; $assocSortCompare = '$a = $a["'.$key.'"]; $b = $b["'.$key.'"];'; if (is_numeric($array[0][$key])) { $assocSortCompare.= ' return ($a == $b) ? 0 : (($a < $b) ? -1 : 1);'; } else { $assocSortCompare.= ' return strcmp($a,$b);'; } $assocSortCompare = create_function('$a,$b',$assocSortCompare); return usort($array,$assocSortCompare); } nick
This little function will move an array element up or down. Unlike the similar function in a previous comment this will work for associative arrays too. Because it uses current to traverse the array it will fail if a value is false (or 0). It could probably be rewritten to use each() but I couldn't work it out. <?php function array_move_element($array, $value, $direction = 'up') { $temp = array(); if(end($array) == $value && $direction == 'down') { return $array; } if(reset($array) == $value && $direction == 'up') { return $array; } while ($array_value = current($array)) { $this_key = key($array); if ($array_value == $value) { if($direction == 'down') { $next_value = next($array); $temp[key($array)] = $next_value; $temp[$this_key] = $array_value; } else { $prev_value = prev($array); $prev_key = key($array); unset($temp[$prev_key]); $temp[$this_key] = $array_value; $temp[$prev_key] = $prev_value; next($array); next($array); } continue; } else { $temp[$this_key] = $array_value; } next($array); } return $temp; } ?> frando
This is a super-hard array conversion function. It only returns TRUE if the two arrays are completely identical, that means that they have the same keys, and the values of all keys are exactly the same (compared with ===). <?php function array_same($a1, $a2) { if (!is_array($a1) || !is_array($a2)) return false; $keys = array_merge(array_keys($a1), array_keys($a2)); foreach ($keys as $k) { if (!isset($a2[$k]) || !isset($a1[$k])) return false; if (is_array($a1[$k]) || is_array($a2[$k])) { if (!array_same($a1[$k], $a2[$k])) return false; } else { if (! ($a1[$k] === $a2[$k])) return false; } } return true; } ?> phamphong_tn
This is a code remove an other row of array <?php //$mang is an array, $id is index of row in array function remove($mang,$id) { $flag = false; $count = count($mang); $i = 0; while ($flag!=true && $i<$count) { if ($i==$id) { unset($mang[$i]); $flag = true; $index = $i; } else { if ($temp) { array_push($temp,$mang[$i]); } else { $temp = array($mang[$i]); } } $i++; } if ($flag) { while ($index<$count) { if ($temp) { array_push($temp,$mang[$index+1]); } else { $temp = array($mang[$index+1]); } $index++; } } array_pop($temp); return $temp; } $arr = array(array("id"=>"1","name"=>"b"),array("id"=>"2","name"=>"d")); array_push($arr,array("id"=>"3","name"=>"f")); array_push($arr,array("id"=>4,"name"=>"g")); $arr = remove($arr,2); echo "<pre>"; print_r($arr); ?> alessandronunes
The Ninmja sugestion plus multidiomensional array search (recursive): function cleanArray($array) { foreach ($array as $index => $value) { if(is_array($array[$index])) $array[$index] = cleanArray($array[$index]); if (empty($value)) unset($array[$index]); } return $array; } ryan1_00
The following will take a query result and create a dynamic table for it. Using the Key() function to get the table headers and the current() function for the actual values. $result = mysql_query($qry) or die ("<center> ERROR: ".mysql_error()."</center>"); $x = 0; echo "<table border=\"1\" align=\"center\">"; while($row = mysql_fetch_assoc($result)) { if ($x == 0) // so that table headers are only created on the first pass { $col = (count($row)); // counts number of elements in the array $x=1; echo "<tr>"; for ($y=0; $y<$col; $y++) { echo "<th>"; echo key($row); // gets the names of the fields echo "</th>"; next($row); } echo "</tr>"; } reset($row); echo "<tr>"; for ($y=0; $y<$col; $y++) { echo "<td valign=\"top\" align=\"left\">"; echo current($row); echo"</td>"; next($row); } echo "</tr>"; } // end of while loop zspencer
The array system is sadly lacking a "set" function... I needed one that would set the pointer to the key that I specified. So I wrote my own. <? $array=array(); $array['a']='lala'; $array['b']='blabla'; $array['c']='nono'; set($array, 'b'); echo current($array); // outputs blabla function set(&$array, $key) { reset($array); while($current=key($array)) { if($current==$key) { return true; } next($array); } return false; } ?> xxellisxx
Super simple way of converting an array to a string. function array_to_string($array) { foreach ($array as $index => $val) { $val2 .=$val; } return $val2; } admin \x40 uostas.net
simple function to remove element from array saving index sequence <?php function array_remval($val,&$arr){ $i=array_search($val,$arr); if($i===false)return false; $arr=array_merge(array_slice($arr, 0,$i), array_slice($arr, $i+1)); return true; } ?> example: <?php $input=Array('a','b','c','d','e'); array_remval('d',$input); //result: //Array('a','b','c','e'); ?> daenders
Several people here have posted functions for converting arrays to strings, but nobody posted a sister function that would convert it back. Also, their data is not URL safe. These functions are URL safe, hide the data by MIME encoding it, and are much shorter. Enjoy. :-) <?php // Converts an array to a string that is safe to pass via a URL function array_to_string($array) { $retval = ''; foreach ($array as $index => $value) { $retval .= urlencode(base64_encode($index)) . '|' . urlencode(base64_encode($value)) . '||'; } return urlencode(substr($retval, 0, -2)); } // Converts a string created by array_to_string() back into an array. function string_to_array($string) { $retval = array(); $string = urldecode($string); $tmp_array = explode('||', $string); foreach ($tmp_array as $tmp_val) { list($index, $value) = explode('|', $tmp_val); $retval[base64_decode(urldecode($index))] = base64_decode(urldecode($value)); } return $retval; } // Example: $array1 = array('index1' => 'val1', 'index2' => 'val2', 'index3' => 'val3'); echo '<pre>'; print_r($array1); echo '</pre>'; $string = array_to_string($array1); echo '$string: '.$string.'<br />'; $array2 = string_to_array($string); echo '<pre>'; print_r($array2); echo '</pre>'; ?> michael
Reply to array_cartesian_product of skopek at mediatac dot com, 13-Oct-2004 12:44: Your function does not work in my configuration (WinXP, apache 2.0, php 4.3.11). This part of code: ... } else { //if next returns false, then reset and go on with previuos array... reset($arrays[$j]); } ... cause infinite loop. Replacing to ... } elseif (isset($arrays[$j])) { reset($arrays[$j]); } ... works good. My complete working function (additionaly strings as keys are allowed): <?php function array_cartesian_product($arrays) { $result = array(); $arrays = array_values($arrays); $sizeIn = sizeof($arrays); $size = $sizeIn > 0 ? 1 : 0; foreach ($arrays as $array) $size = $size * sizeof($array); for ($i = 0; $i < $size; $i ++) { $result[$i] = array(); for ($j = 0; $j < $sizeIn; $j ++) array_push($result[$i], current($arrays[$j])); for ($j = ($sizeIn -1); $j >= 0; $j --) { if (next($arrays[$j])) break; elseif (isset ($arrays[$j])) reset($arrays[$j]); } } return $result; } ?> r2rien
Regarding the string to array (parse_array) function posted by Kevin Law(thanks) and urlencoded by vinaur(thanks) , The function will not work correctly if you use integer values as keys. Thus I exchanged array_merge with a simple combined operator. For example dealing with 4digit year strings as keys; parse_array(2006:abc,B:bcd) will produce => with array_merge: <?php //... $result = array_merge($result, parse_line2array(substr($line,$comma_pos+1))); //... $result = array_merge($result, parse_line2array($line)); //... ?> Array ( [0] => abc [B] => bcd ) => with combined operator: <?php //... $result += parse_line2array(substr($line,$comma_pos+1)); //... $result += parse_line2array($line); //... ?> Array ( [2006] => abc [B] => bcd ) ob
Regarding the function of spam at madhermit dot net from January 9th 2006: That function only preserves the deepest keys and values. If you try to flatten an array with that function where the deepest instance of keys might be the same where as keys in the "key-path" are different, values will be overwritten. So here is a function that preserves the whole key-path and the keys of the flattened array will be string keys consisting of the key-path separated by $Separator. <?php // flatten multidimensional array to one dimension // preserves keys by generating a key for the flattened array which consists of the // key-path of the multidimensional array separated by $Separator // usage: array ArrayFlatten( array Array [, string Separator] ) function ArrayFlatten($Array,$Separator="_",$FlattenedKey='') { $FlattenedArray=Array(); foreach($Array as $Key => $Value) { if(is_Array($Value)) $FlattenedArray=Array_merge($FlattenedArray, ArrayFlatten($Value,$Separator, (strlen($FlattenedKey)>0 ?$FlattenedKey.$Separator :"").$Key) ); else $FlattenedArray[$FlattenedKey.$Separator.$Key]=$Value; } return $FlattenedArray; } ?> vinaur
Regarding the array to string (parse_line) and string to array (parse_array) functions posted below by Kevin Law. The functions will not work correctly if the array being parsed contains values that include commas and possibly parentheses. To solve this problem I added urlencode and urldecode functions and the result looks like this: <?php function parse_line($array){ $line = ""; foreach($array AS $key => $value){ if(is_array($value)){ $value = "(". parse_line($value) . ")"; } else { $value = urlencode($value); } $line = $line . "," . urlencode($key) . ":" . $value . ""; } $line = substr($line, 1); return $line; } function parse_array($line){ $q_pos = strpos($line, ":"); $name = urldecode(substr($line,0,$q_pos)); $line = trim(substr($line,$q_pos+1)); $open_backet_pos = strpos($line, "("); if($open_backet_pos===false || $open_backet_pos>0){ $comma_pos = strpos($line, ","); if($comma_pos===false){ $result[$name] = urldecode($line); $line = ""; }else{ $result[$name] = urldecode(substr($line,0,$comma_pos)); $result = array_merge($result, parse_array(substr($line,$comma_pos+1))); $line = ""; } }else if ($open_backet_pos==0){ $line = substr($line,1); $num_backet = 1; $line_char_array = str_split($line); for($index = 0; count($line_char_array); $index++){ if($line_char_array[$index] == '('){ $num_backet++; }else if ($line_char_array[$index] == ')'){ $num_backet--; } if($num_backet == 0){ break; } } $sub_line = substr($line,0,$index); $result[$name] = parse_array($sub_line); $line = substr($line,$index+2); } if(strlen($line)!=0){ $result = array_merge($result, parse_array($line)); } return $result; } ?> ob
Regarding my own posting 2 postings down about the function ArrayDepth() to find the maximum depth of a multidimensional array: A number of functions for counting array dimensions have been posted. And I tried using them. Yet, if at all they only return the depth of the first branch of the array. They can not handle arrays where a later path holds a more dimension than the first. My version will check all paths down the array and return the maximum depth. That's why I posted it. hayley watson
Regarding cyberchrist at futura dot net's function. It makes an unnecessary array_merge(); the elements of $b that are merged with those of $a are immediately removed again by the array_diff(). The "limiting to known values" is entirely unnecessary, in other words: arrays already only contain "known values". Also, the description and function only address the issue of whether $a is a subset of $b, not whether it is a proper subset. For $a to be a proper subset of $b, it must also be the case that $b is not a subset of $a. Taking those points into account (and a personal aesthetic dislike of "if(test) return true; else return false;" gives: <?php function is_subset($a, $b) { return count(array_diff($a,$b))==0; } function is_proper_subset($a, $b) { return is_subset($a, $b) && !is_subset($b, $a); } ?> padraig
Re removing blank elements from arrays, this is even more concise: <?php $arraytest = array_diff($arraytest, array("")); ?> kthejoker - google mail
re jeremyquintion: your solution is array_merge(), which will reindex a numeric array. So if you have $array[0] = "something"; $array[1] = "something else"; $array[2] = "yet another"; unset($array[1]); array_merge($array); the result is $array[0] = "something"; $array[1] = "yet another"; and then you can use a for loop accordingly. Obviously this isn't ideal if you want to maintain key association. php_spam {at erif dot org
public domain, yadda yadda. :) This function takes a flatfile-like array (like the results of a joined query) and normalizes it based on whichever parameters you like. <?php function hashByFields($things,$fields) { $retval=null; $count = count($fields); foreach ($things as $thing) { $fwibble =& $retval; for ($j=0;$j<$count;$j++) { $val = $thing[$fields[$j]]; if ($j == $count - 1) { $fwibble[$val] = $thing; } else if (!isset($fwibble[$val])) { $fwibble[$val] = Array(); } $fwibble =& $fwibble[$val]; } } return $retval; } ?> php_spam
Public domain, yadda yadda. This is an extension of the assocSort below, patched up a bit. Feedback would be wonderful. <?php function assocMultiSort(&$array,$keys,$directions=true) { if (!is_array($array) || count($array) == 0) return true; if (!is_array($keys)) { $keys = Array($keys); } //we want "current" instead of necessarily the "zeroth" element; there may not be a zeroth element $test = current($array); $assocSortCompare = ''; for ($i=0,$count=count($keys);$i<$count;$i++) { $key = $keys[$i]; if (is_array($directions)) { $direction = $directions[$i]; } else { $direction = $directions; } if ($i > 0) $assocSortCompare .= 'if ($retval != 0) return $retval; '; $assocSortCompare .= '$ax = $a["'.$key.'"]; $bx = $b["'.$key.'"];'; //TODO -- if it's "blank", search up the list until we find something not blank if (is_numeric($test[$key]) || ($test[$key] == ((int)$test[$key]))) { if ($direction) { $assocSortCompare.= ' $retval = ($ax == $bx) ? 0 : (($ax < $bx) ? -1 : 1);'; } else { $assocSortCompare.= ' $retval = ($ax == $bx) ? 0 : (($ax < $bx) ? 1 : -1);'; } } else { if ($direction) { $assocSortCompare.= ' $retval = strcmp($ax,$bx);'; } else { $assocSortCompare.= ' $retval = strcmp($bx,$ax);'; } } } $assocSortCompare.= ' return $retval;'; $assocSortCompare = create_function('$a,$b',$assocSortCompare); $retval = usort($array,$assocSortCompare); return $retval; } ?> tvscoundrel
phamphong_tn's function to remove an element from an array seems a bit complicated for something that is actually quite simple. Here's another way to remove an element from an array: <?php //the function function removeArrayElement(&$arr, $index){ if(isset($arr[$index])){ array_splice($arr, $index, 1); } } //testing the function $test = array("zero", "one", "two", "three"); echo "<pre>"; print_r($test); echo "</pre>"; $this->removeArrayElement($test, 2); echo "<pre>"; print_r($test); echo "</pre>"; ?> output: Array ( [0] => zero [1] => one [2] => two [3] => three ) Array ( [0] => zero [1] => one [2] => three ) To remove an element from an associative array is even simpler: unset($arr[$index]); sneskid
notice <?php $v = array(); $v['0'] = 's'; $v[0] = 'i'; echo $v['0']; echo $v[0]; $v['.1'] = 's'; $v[.1] = 'i'; echo $v['.1']; echo $v[.1]; $v['0.1'] = 's'; $v[0.1] = 'i'; echo $v['0.1']; echo $v[0.1]; // output: iisi foreach($v as $key => $val) echo $v[$key] . ' : ' . $val . "\r\n"; // output: iisi ?> This means foreach preserves the key data type, it also means arrays distinguish between float numbers and float like strings, unlike integers rune
Notice that keys are considered equal if they are "=="-equal. That is: <? $a = array(); $a[1] = 'this is the first value'; $a[true] = 'this value overrides the first value'; $a['1'] = 'so does this one'; ?> eddypearson
Little function to remove blank values from an array (will not reorder indexes however): function CleanA($arr) { while ($count < count($arr)) { if ($arr[$count] == "") { unset($arr[$count]); } $count++; } return $arr; } cyberchrist
Lately, dealing with databases, I've been finding myself needing to know if one array, $a, is a proper subset of $b. Mathematically, this is asking (in set theory) [excuse the use of u and n instead of proper Unicode): ( A u B ) n ( ~ B ) What this does is it first limits to known values, then looks for anything outside of B but in the union of A and B (which would be those things in A which are not also in B). If any value exists in this set, then A is NOT a proper subset of B, because a value exists in A but not in B. For A to be a proper subset, all values in A must be in B. I'm sure this could easily be done any number of ways but this seems to work for me. It's not got a lot of error detection such as sterilizing inputs or checking input types. // bool array_subset( array, array ) // Returns true if $a is a proper subset of $b, returns false otherwise. function array_subset( $a, $b ) { if( count( array_diff( array_merge($a,$b), $b)) == 0 ) return true; else return false; } dieter peeters
in response to: Domenic Denicola I reworked your function a bit and thought i just as well could post it. Below is the cleaner version, just cut and paste ;) The third parameter is of little use to the coder, unless javascript declaration of variables changes at some point in the future - who knows. Only minor point is the added parameter which probably gets copied every recursive call with an empty value, though i don't know the exact ways how php handles recursion internally. Most of the time php is pretty smart when optimizing code and an empty string shouldn't take much memory anyway :) <?php function phpArrayToJsArray($name,$array,$prePend='var ') { if (is_array($array)) { // Array recursion $result = $name.' = new Array();'."\n"; foreach ($array as $key => $value) { $result .= phpArrayToJsArray($name.'["'.$key.'"]',$value,''); } } else { // Base case of recursion $result = $name.' = "'.$array.'";'."\n"; } return $prePend.$result; } ?> ben
In reference to the cleanArray function below, note that it checks the value using the empty() function and removes it. This will also remove the integer value 0 and the string "0" among other possibly unexpected things. Check the manual entry for empty().
sergio
In a pratical problem, I was involved in a system of queries giving the behaviour of all combinations of some parameters. How to write those queries? The problem was to generate automatically every possible combination of those parameters. I didn't find a function and I wrote it. (Naturally, a different way could be to build a binary sequence, but I find this function more compact and useful). So, consider an array of objects and suppose to need all possibile combinations of those objects. Here is the function, that could be useful for some folk. Enjoy. <?php function combinations($elements) { if (is_array($elements)) { /* I want to generate an array of combinations, i.e. an array whose elements are arrays composed by the elements of the starting object, combined in all possible ways. The empty array must be an element of the target array. */ $combinations=array(array()); # don't forget the empty arrangement! /* Built the target array, the algorithm is to repeat the operations below for each object of the starting array: - take the object from the starting array; - generate all arrays given by the target array elements merged with the current object; - add every new combination to the target array (the array of arrays); - add the current object (as a vector) to the target array, as a combination of one element. */ foreach ($elements as $element) { $new_combinations=array(); # temporary array, see below foreach ($combinations as $combination) { $new_combination=array_merge($combination,(array)$element); # I cannot merge directly with the main array ($combinations) because I'm in the foreach cycle # I use a temporary array array_push($new_combinations,$new_combination); } $combinations=array_merge($combinations,$new_combinations); } return $combinations; } else { return false; } } ?> To test the function: <?php $elements=array('bitter','sour','salty','sweet'); print_r(combinations($elements)); ?> The exemple was suggested in 6th century BC. See why on: http://en.wikipedia.org/wiki/Combinatorics#Overview_and_history wmakend
if you want to sort array like this one $aInt = array('1','2','3','4'); and you to have somethings like this 1 --- 2 1 --- 3 1 --- 4 2 --- 3 2 --- 4 3 --- 4 you can do this like with $NumInt = count($aInt); for($j=0; $j<=$NumInt-1; $j++){ $first = $aInt[$j]; for ($i=1; $i<=$NumInt-1-$j; $i++) { echo $first." --- ".$aInt[$i+$j]." "; } } sean
I wrote this function to parse arrays so they work with SQL strings if you need to use the MySQL "IN()" function. function format_sql_array($array) { $SQLstring = ""; foreach($array as $item) { $SQLstring .= "'$item',"; } $SQLstring = rtrim($SQLstring, ","); $SQLstring = str_replace("'',", "", $SQLstring); return $SQLstring; } Example: $my_array = array("red", "blue", "green"); $sql_array = format_sql_array($my_array); //$sql_array is now "'red','blue','green'" Sample SQL: $SQL = "SELECT FROM colors_table WHERE color IN($sql_array)"; g4wx3
I needed a function to convert a php array into a javascript array. No problem i found it on "the net". But the function i found wasn't good enough, instead of return a string with javascript-array it echoed directly everything. I wanted to write the string to a file, when calling the function out of my function libary. Secondly, there where minor "bugs" in the script, when you're original array contained characters like line breaks(\r\n,..), or quotes('), it would hack up the javascript array Sow, i changed the function and fixed the bug. <?php //SUPER COOL : http://www.communitymx.com/content/article.cfm?page=3&cid=7CD16 //Checkout: REVERSE: http://www.hscripts.com/tutorials/php/jsArrayToPHP.php //Convert a PHP array to a JavaScript one (rev. 4) //Changlog by g4wx3: echo replaced by $output, added function output function output($string) //make javascript ready { $string = str_replace( array( '\\' , '\'' ), array('\\\\', '\\\'') , $string); //-> for javascript array $string = str_replace( array("\r\n", "\r", "\n") , ' ' , $string); //nl2br return $string; } function arrayToJS4($array, $baseName ) { //Write out the initial array definition //v4 echo ($baseName . " = new Array(); \r\n "); $output = $baseName . " = new Array(); \r\n "; //Reset the array loop pointer reset ($array); //Use list() and each() to loop over each key/value //pair of the array while (list($key, $value) = each($array)) { if (is_numeric($key)) { //A numeric key, so output as usual $outKey = "[" . $key . "]"; } else { //A string key, so output as a string $outKey = "['" . $key . "']"; } if (is_array($value)) { //The value is another array, so simply call //another instance of this function to handle it $output .= arrayToJS4($value, $baseName . $outKey); } else { //Output the key declaration //v4 echo ($baseName . $outKey . " = "); $output .= $baseName . $outKey . " = "; //Now output the value if (is_string($value)) { //Output as a string, as we did before //v4 echo ("'" . output($value) . "'; \r\n "); $output .= "'" . output($value) . "'; \r\n "; } else if ($value === false) { //Explicitly output false //v4 echo ("false; \r\n"); $output .= "false; \r\n"; } else if ($value === NULL) { //Explicitly output null //v4 echo ("null; \r\n"); $output .= "null; \r\n"; } else if ($value === true) { //Explicitly output true //v4 echo ("true; \r\n"); $output .= "true; \r\n"; } else { //Output the value directly otherwise //v4 echo ($value . "; \r\n"); $output .= $value . "; \r\n"; } } } return $output; } ?> You can use this for printing $_GET array, for example stalker
I had some problems while selecting sub-arrays from multi-dimensional arrays (like the SQL-WHERE clause), so i wrote the following function: <?php function selectMultiArray($__multiarray,$__key,$__value) { foreach($__multiarray as $multipart) { if($multipart[$__key] == $__value) { $__return[] = $multipart; } } if(empty($__return)) { return FALSE; } return $__return; } ?> hope someones finding this helpful. If you have better was for getting to this, please answer. greets, St4Lk3R djspy187
I had an issue with arrays and copying them by reference as follows. // Loop on the list and insert default values foreach ($navigation as &$item) { $children = &$item['children']}; foreach ($children as &$child) { // Do stuff } } This would give me error message Fatal error: Cannot create references to/from string offsets nor overloaded objects in /var/www/dev/kh_system/navigation.php on line 103 Even though $item['children'] is an array. The workaround is to do a for ($i =0;$i < count($Item);$i++) and to then access the children like this $navigation[$i]['children'] colin
I couldn't get the previous set pointer functions working for whatever reason so I modifed. I trigger errors if needed but obviously you can do whatever // setPointer - Sets the pointer to the provided $key in provided $array final private function setPointer(&$array, $set_key) { // Check if $array is an array if (!is_array($array)) { trigger_error('$array must be an array', E_USER_ERROR); } // Check if $key is in $array if (!array_key_exists($set_key, $array)) { trigger_error('$set_key must exist in $array', E_USER_ERROR); } // Set array pointer to first element reset($array); // Cycle through array while ($set_key != key($array)) { // Advance the pointer next($array); } } Try with: $array = array(); $array[0] = 'zero'; $array[1] = 'one'; $array[2] = 'two'; $array[3] = 'three'; // Set the pointer setPointer($array, 1); // Display elements echo current($array); // Outputs 'one' echo next($array); // Outputs 'two' m227 a poczta.onet.pl
How to count dimensions in multi-array? (corrected) previous version didn't work when called more than one time. ($dimcount was preserved from previous call) This is the way I corrected this: function countdim($array) { if (is_array(reset($array))) $return = countdim(reset($array)) + 1; else $return = 1; return $return; } This function will return int number of array dimensions. vladson
Hope someone find it useful.. <?php /* Function: eratosthenes Usage: array eratosthenes ( int max_value ) Description: Sieve of Eratosthenes is a simple, ancient algorithm for finding all prime numbers up to a specified integer. It was created by Eratosthenes, an ancient Greek mathematician. */ function eratosthenes($max) { $sieve = array_fill(2, ($max-1), false); while ($key = array_search(false, $sieve)) { $sieve[$key] = true; for ($i=$key*$key; $i<=$max; $i+=$key) { if (array_key_exists($i, $sieve)) { unset($sieve[$i]); } } } return array_keys($sieve); } ?> peanutpad
heres a function from http://www.linksback.org Feedback welcome, of course! Public domain, yadda yadda. function mySort(&$array,$key) { if (!is_array($array) || count($array) == 0) return true; $assocSortCompare = '$a = $a["'.$key.'"]; $b = $b["'.$key.'"];'; if (is_numeric($array[0][$key])) { $assocSortCompare.= ' return ($a == $b) ? 0 : (($a < $b) ? -1 : 1);'; } else { $assocSortCompare.= ' return strcmp($a,$b);'; } $assocSortCompare = create_function('$a,$b',$assocSortCompare); return usort($array,$assocSortCompare); } designatevoid
Here's an improvement to the array_to_string and string_to_array functions posted by daenders AT yahoo DOT com above. They now handle NULL values correctly. <?php // Converts an array to a string that is safe to pass via a URL function array_to_string($array) { $retval = ''; $null_value = "^^^"; foreach ($array as $index => $value) { if (!$value) $value = $null_value; $retval .= urlencode(base64_encode($index)) . '|' . urlencode(base64_encode($value)) . '||'; } return urlencode(substr($retval, 0, -2)); } // Converts a string created by array_to_string() back into an array. function string_to_array($string) { $retval = array(); $string = urldecode($string); $tmp_array = explode('||', $string); $null_value = urlencode(base64_encode("^^^")); foreach ($tmp_array as $tmp_val) { list($index, $value) = explode('|', $tmp_val); $decoded_index = base64_decode(urldecode($index)); if($value != $null_value) $retval[$decoded_index] = base64_decode(urldecode($value)); else $retval[$decoded_index] = NULL; } return $retval; } ?> atomo64
Here's a simple way to convert an array to a string and vice-versa. Note that it does NOT support string keys, for more information take a look at what it does: <?php class OptionAsArray { function make_the_arr($value) { $newValue=array(); $vals=explode('&',$value); foreach($vals as $v) { if($v{0}=='@') $newValue[]=$this->make_the_arr( urldecode(substr($v,1))); else $newValue[]=urldecode($v); } if(empty($newValue)) return false; else return $newValue; } function make_the_value($arr) { $newValue=array(); foreach($arr as $value) { if(is_array($value)) $newValue[]='@'.urlencode( implode('&',$this->make_the_value($value))); else $newValue[]=urlencode($value); } if(empty($newValue)) return false; else return $newValue; } } ?> pedja
Here is the function that cleans array of empty records. It goes recursive through multidimensional array and erases any item that has empty value or is empty array. This actually works on any variable type, not just arrays. <?php function clean_item ($p_value) { if (is_array ($p_value)) { if ( count ($p_value) == 0) { $p_value = null; } else { foreach ($p_value as $m_key => $m_value) { $p_value[$m_key] = clean_item ($m_value); if (empty ($p_value[$m_key])) unset ($p_value[$m_key]); } } } else { if (empty ($p_value)) { $p_value = null; } } return $p_value; } ?> Example: <?php $m_array['aaa'] = 'bbb'; $m_array['ccc'] = ''; $m_array['ddd'] = Array(); $m_array['eee']['fff'] = Array(); $m_array['eee']['ggg'] = ''; $m_array['eee']['hhh'] = 'iii'; $m_array['eee']['j']['a'] = 'gh'; $m_array['eee']['j']['b'] = ''; $m_array['eee']['j']['c'] = 'rty'; $m_array['eee']['j']['d'] = Array(); $m_array['eee']['j']['e'][1] = 'r'; $m_array['eee']['j']['e'][2] = 'y'; $m_array['eee']['j']['e'][1] = ''; $m_array['eee']['j']['e'][4] = Array(); $m_array['eee']['j']['e'][5] = ''; $m_clean = $seo->clean_item ($m_array); print_r ($m_array); print_r ($m_clean); ?> Variable $m_clean contains: Array ( [aaa] => bbb [eee] => Array ( [hhh] => iii [j] => Array ( [a] => gh [c] => rty [e] => Array ( [2] => y ) ) ) ) ?> ob
Here is a function to find out the maximum depth of a multidimensional array. <?php // return depth of given array // if Array is a string ArrayDepth() will return 0 // usage: int ArrayDepth(array Array) function ArrayDepth($Array,$DepthCount=-1,$DepthArray=array()) { $DepthCount++; if (is_array($Array)) foreach ($Array as $Key => $Value) $DepthArray[]=ArrayDepth($Value,$DepthCount); else return $DepthCount; foreach($DepthArray as $Value) $Depth=$Value>$Depth?$Value:$Depth; return $Depth; } ?> spam
Here is a function that recursively flattens an multidimensional array while maintaining keys. Hopefully it is useful to someone.. Example Input: Array ( [name] => John Doe [email] => johndoe@earthlink.net [addresses] => Array ( [1] => Array ( [address] => 555 Somewhere [city] => Podunk [state] => CA [zip] => 90120 ) [2] => Array ( [address] => 333 Someother Place [city] => Podunk [state] => CA [zip] => 91103 ) ) ) Example output: Array ( [name] => John Doe [email] => johndoe@earthlink.net [address1] => 555 Somewhere [city1] => Podunk [state1] => CA [zip1] => 90120 [address2] => 333 Someother Place [city2] => Podunk [state2] => CA [zip2] => 91103 ) <? function flattenArray($array,$keyname='') { $tmp = array(); foreach($array as $key => $value) { if(is_array($value)) $tmp = array_merge($tmp,flattenArray($value,$key)); else $tmp[$key.$keyname] = $value; } return $tmp; } ?> nicolai bloch
Here are two functions for checking if an array contains numeric or string indexes only. Hope someone else will find them useful. <?php //Check for numeric array function isNumeric($ar) { $keys = array_keys($ar); natsort($keys); //String keys will be last return is_int(array_pop($keys)); } //Check for associative array function isAssoc($ar) { $keys = array_keys($ar); natsort($keys); //Numeric keys will be first return is_string(array_shift($keys)); } ?> ob
Here are two functions Array2String() and String2Array() based on functions posted below by daenders AT yahoo DOT com. An improvement handling NULL values correctly was posted by designatevoid at gmail dot com. My version also solves the NULL-value-problem plus keeps support of multidimensional arrays. <?php // convert a multidimensional array to url save and encoded string // usage: string Array2String( array Array ) function Array2String($Array) { $Return=''; $NullValue="^^^"; foreach ($Array as $Key => $Value) { if(is_array($Value)) $ReturnValue='^^array^'.Array2String($Value); else $ReturnValue=(strlen($Value)>0)?$Value:$NullValue; $Return.=urlencode(base64_encode($Key)) . '|' . urlencode(base64_encode($ReturnValue)).'||'; } return urlencode(substr($Return,0,-2)); } ?> <?php // convert a string generated with Array2String() back to the original (multidimensional) array // usage: array String2Array ( string String) function String2Array($String) { $Return=array(); $String=urldecode($String); $TempArray=explode('||',$String); $NullValue=urlencode(base64_encode("^^^")); foreach ($TempArray as $TempValue) { list($Key,$Value)=explode('|',$TempValue); $DecodedKey=base64_decode(urldecode($Key)); if($Value!=$NullValue) { $ReturnValue=base64_decode(urldecode($Value)); if(substr($ReturnValue,0,8)=='^^array^') $ReturnValue=String2Array(substr($ReturnValue,8)); $Return[$DecodedKey]=$ReturnValue; } else $Return[$DecodedKey]=NULL; } return $Return; } ?> elkabong
Hello all! I've just been working on a system to automatically manage virtualhosts on an Apache box and I needed to duplicate some multidimensional arrays containing references to other multidimensional array some of which also contained references. These big arrays are defaults which need to be overwritten on a per-virtualhost basis, so copying references into the virtualhost arrays was not an option (as the defults would get corrupted). After hours of banging me head on the wall, this is what I've come up with: <?PHP # Tested on PHP Version 5.0.4 # Recursively set $copy[$x] to the actual values of $array[$x] function array_deep_copy (&$array, &$copy) { if(!is_array($copy)) $copy = array(); foreach($array as $k => $v) { if(is_array($v)) { array_deep_copy($v,$copy[$k]); } else { $copy[$k] = $v; } } } # To call it do this: $my_lovely_reference_free_array = array(); array_deep_copy($my_array_full_of_references, $my_lovely_reference_free_array); # Now you can modify all of $my_lovely_reference_free_array without # worrying about $my_array_full_of_references! ?> NOTE: Don't use this on self-referencing arrays! I haven't tried it yet but I'm guessing an infinate loop will occur... I hope someone finds this useful, I'm only a beginner so if there's any fatal flaws or improvements please let me know! piotr dot galas+phpnet
Function which converts array to string but not serialize it. function arraytostring($array) { $text.="array("; $count=count($array); foreach ($array as $key=>$value) { $x++; if (is_array($value)) { if(substr($text,-1,1)==')') $text .= ','; $text.='"'.$key.'"'."=>".arraytostring($value); continue; } $text.="\"$key\"=>\"$value\""; if ($count!=$x) $text.=","; } $text.=")"; if(substr($text, -4, 4)=='),),')$text.='))'; return $text; } christian
function array_flatten(&$a,$pref='',$sep='_') { $ret=array(); foreach ($a as $i => $j) { if (is_array($j)) { $ret=array_merge($ret, array_flatten($j, $pref . ( strlen($pref) != 0 ? $sep : '' ) . $i ) ); } else { $ret[$pref. $sep . $i] = $j; } } return $ret; } q1712
for your intrest: the values of the constans used are (all integer): CASE_LOWER = 0 CASE_UPPER = 1 SORT_ASC = 4 SORT_DESC = 3 SORT_REGULAR = 0 SORT_NUMERIC = 1 SORT_STRING = 2 SORT_LOCALE_STRING = 5 COUNT_NORMAL = 0 COUNT_RECURSIVE = 1 EXTR_OVERWRITE = 0 EXTR_SKIP = 1 EXTR_PREFIX_SAME = 2 EXTR_PREFIX_ALL = 3 EXTR_PREFIX_INVALID = 4 EXTR_PREFIX_IF_EXISTS = 5 EXTR_IF_EXISTS = 6 EXTR_REFS = 256 simone dot carletti
Ever wanted to obtain a subset of an associative array from a list of parameters (stored into a non-associative array)? Give this a try: <?php $params = array("name" => "Simone", "gender" => "M", "city" => "Macerata", "phone" => 123); $fields = array("name", "city"); echo "<pre>"; print_r($params); print_r($fields); print_r(subArr($params, $fields)); function subArr($assocArrHaystack, $arrFields) { $arrSub = array(); foreach ($assocArrHaystack as $key => $value) { if (in_array($key, $arrFields)) { $arrSub[$key] = $value; } } return $arrSub; } ?> And the output is: Array ( [name] => Simone [gender] => M [city] => Macerata [phone] => 123 ) Array ( [0] => name [1] => city ) Array ( [name] => Simone [city] => Macerata ) Enjoy! Simone webdev
Bugs happen, but how can people post functions that WON'T EVEN COMPILE! I truly detest finding a cool code snippet or function and then having to debug them. Sorry for the rant, but I have experienced this scenario a number of times. TEST YOUR CODE, THEN POST! Here is a revised and corrected previously posted function ArrayDepth, which had 3 bugs and yes, would not compile. function ArrayDepth($Array,$DepthCount=-1) { // Find maximum depth of an array // Usage: int ArrayDepth( array $array ) // returns integer with max depth // if Array is a string or an empty array it will return 0 $DepthArray=array(0); $DepthCount++; $Depth = 0; if (is_array($Array)) foreach ($Array as $Key => $Value) { $DepthArray[]=ArrayDepth($Value,$DepthCount); } else return $DepthCount; return max($DepthCount,max($DepthArray)); } msajko
array_to_string and sister function string_to_array with multi dimensional array support. // Converts an array to a string that is safe to pass via a URL function array_to_string($array) { $retval = ''; $null_value = "^^^"; foreach ($array as $index => $val) { if(gettype($val)=='array') $value='^^array^'.array_to_string($val); else $value=$val; if (!$value) $value = $null_value; $retval .= urlencode(base64_encode($index)) . '|' . urlencode(base64_encode($value)) . '||'; } return urlencode(substr($retval, 0, -2)); } // Converts a string created by array_to_string() back into an array. function string_to_array($string) { $retval = array(); $string = urldecode($string); $tmp_array = explode('||', $string); $null_value = urlencode(base64_encode("^^^")); foreach ($tmp_array as $tmp_val) { list($index, $value) = explode('|', $tmp_val); $decoded_index = base64_decode(urldecode($index)); if($value != $null_value){ $val= base64_decode(urldecode($value)); if(substr($val,0,8)=='^^array^') $val=string_to_array(substr($val,8)); $retval[$decoded_index]=$val; } else $retval[$decoded_index] = NULL; } return $retval; } domenic denicola
Another JavaScript conversion, this time to objects instead of arrays. They can be accessed the same way, but are declared much shorter, so it saves some download time for your users: <? function PhpArrayToJsObject($array, $objName) { return 'var ' . $objName . ' = ' . PhpArrayToJsObject_Recurse($array) . ";\n"; } function PhpArrayToJsObject_Recurse($array) { // Base case of recursion: when the passed value is not a PHP array, just output it (in quotes). if(! is_array($array) ) { // Handle null specially: otherwise it becomes "". if ($array === null) { return 'null'; } return '"' . $array . '"'; } // Open this JS object. $retVal = "{"; // Output all key/value pairs as "$key" : $value // * Output a JS object (using recursion), if $value is a PHP array. // * Output the value in quotes, if $value is not an array (see above). $first = true; foreach($array as $key => $value) { // Add a comma before all but the first pair. if (! $first ) { $retVal .= ', '; } $first = false; // Quote $key if it's a string. if (is_string($key) ) { $key = '"' . $key . '"'; } $retVal .= $key . ' : ' . PhpArrayToJsObject_Recurse($value); } // Close and return the JS object. return $retVal . "}"; } ?> Difference from previous function: null values are no longer "" in the object, they are JavaScript null. So for example: <? $theArray = array("A" => array("a", "b", "c" => array("x")), "B" => "y"); echo PhpArrayToJsObject($theArray, "myArray"); ?> Gives: var myArray = {"A" : {0 : "a", 1 : "b", "c" : {0 : "x"}}, "B" : "y"}; You can still access them just like arrays, with myArray["A"][0] or myArray["A"]["c"][0] or whatever. Just shrinks your pages. elkabong
An improvement to the array_deep_copy function I posted ages ago which takes a 'snapshot' of an array, making copies of all actual values referenced... Now it is possible to prevent it traversing the tree forever when an array references itself. You can set the default $maxdepth to anything you like, you should never call this function with the $depth specified! <?php /* Make a complete deep copy of an array replacing references with deep copies until a certain depth is reached ($maxdepth) whereupon references are copied as-is... */ function array_deep_copy (&$array, &$copy, $maxdepth=50, $depth=0) { if($depth > $maxdepth) { $copy = $array; return; } if(!is_array($copy)) $copy = array(); foreach($array as $k => &$v) { if(is_array($v)) { array_deep_copy($v,$copy[$k],$maxdepth,++$depth); } else { $copy[$k] = $v; } } } # call it like this: array_deep_copy($array_to_be_copied,$deep_copy_of_array,$maxdepth); ?> Hope someone finds it useful! nimja
A very clean and efficient function to remove empty values from an Array. <?php function cleanArray($array) { foreach ($array as $index => $value) { if (empty($value)) unset($array[$index]); } return $array; } ?> hannes dot dahlberg
A small function to get the median of an array filled with numbers function median($array) { sort($array); return ($array[ceil((count($array) / 2)) - 1] + $array[floor((count($array) / 2))]) / 2; } info
A slight modification in the arraytostring function, posted below. This function lists an array the same way you would define it in PHP. <?PHP function arraytostring($array, $depth = 0) { if($depth > 0) $tab = implode('', array_fill(0, $depth, "\t")); $text.="array(\n"; $count=count($array); foreach ($array as $key=>$value) { $x++; if (is_array($value)) { if(substr($text,-1,1)==')') $text .= ','; $text.=$tab."\t".'"'.$key.'"'." => ".arraytostring($value, $depth+1); continue; } $text.=$tab."\t"."\"$key\" => \"$value\""; if ($count!=$x) $text.=",\n"; } $text.="\n".$tab.")\n"; if(substr($text, -4, 4)=='),),')$text.='))'; return $text; } ?> madness
A little function I like to use instead of the classic one, it lets me choose a better format an is overall more versatile: <? function get_image_size($filename, &$imageinfo){ $rawdata=getimagesize($filename, $imageinfo); $refineddata=$rawdata; if ($rawdata){ $refineddata=$rawdata; $refineddata['width']=$rawdata[0]; $refineddata['height']=$rawdata[1]; $refineddata['type']=$rawdata[2]; $refineddata['attribute']=" ".$rawdata[3]; $refineddata[4]=$rawdata['mime']; } return $refineddata; } ?> Notice I also added the extra space in the attribute field, becuase I usually use it like this: <? echo "<img src=\\"foo.jpg\\"".$imgdata[attribute]." alt=\\"foo\\" />"; ?> This way if the attribute happens to be a null or empty value the tag doesn't contain double spaces. filip
a better array_key_set function: function array_key_set(&$array, $key=0) { if(is_array($array)) { if(!array_key_exists($array, $key)) { return false; } reset($array); while($current = key($array)) { if($current == $key) { return true; } next($array); } } return false; } jeremyquinton
//using the foreach loop of php instead of a normal //for loop with the sizeof operator after unset is used. $values = array(); array_push($values,"lion"); array_push($values,"elephant"); array_push($values,"cheetah"); array_push($values,"wildebeest"); unset($values[2]); //normal for loop thinks array size is three //when sizoef function is used in conjunction //the for loop. for($i = 0;$i < sizeof($values); $i++) { echo "animals " . $values[$i]. "\n"; } //prints animals lion animals elephant animals echo "\n"; //foreach prints the three values left properly foreach($values as $animals) { echo "animal " . $animals. "\n"; } //prints animal lion animal elephant animal wildebeest //simple but valid dkrysiak
// note: my previous post have one small error in call to array_key_exists() - posting again - please remove this comment and that note :-) <?php /* Another version of subArr() function by simone dot carletti at unimc dot it: */ //{{{ array_select() /** * Choose array element with given keys * * @param Array $arr * @param Array $keys Keys/indexes of elements to choose * @return Array Array with elements being references to the elements od original array with chosen indexes. */ function &array_select($arr, $keys) { $res = array(); foreach ($keys as $key) { if (array_key_exists($key, $arr)) { $res[$key] =& $arr[$key]; } } return $res; } // end: array_select() }}} /* In my opinion it should be faster than subArr(). Another difference from subArr() is that elements of returned array are references to the same variables as elements of original array (this can be easily changed) */ ?> g dot bell
/* function to give array of ranks. Handles ties. input $arr is zero based array to be ranked $order is the sorting order 'asc' (default) ranks smallest as 1 'desc' ranks largest as 1 output zero based array of ranks. Ties (repeated values) given equal (integer) values */ function array_rank($arr,$order='asc') { // $direction parameter foreach($arr as $being_ranked) { $t1 = $t2 = 0; if ($order == 'asc') { foreach ($arr as $checking) { if ($checking > $being_ranked) continue; if ($checking < $being_ranked) { $t1++; } else { $t2++; // equal so increment tie counter } } } elseif ($order == 'desc') { foreach ($arr as $checking) { if ($checking < $being_ranked) continue; if ($checking > $being_ranked) { $t1++; } else { $t2++; // equal so increment tie counter } } } $ranks[] = floor($t1 + ($t2 + 1) / 2); } return $ranks; } jonathan
/** * Flattens a multimentional array. * * Takes a multi-dimentional array as input and returns a flattened * array as output. Implemented using a non-recursive algorithm. * Example: * <code> * $in = array('John', 'Jim', array('Jane', 'Jasmine'), 'Jake'); * $out = array_flatten($in); * // $out = array('John', 'Jim', 'Jane', 'Jasmine', 'Jake'); * </code> * * @author Jonathan Sharp <jonathan@sharpmedia.net> * @var array * @returns array */ function array_flatten($array) { while (($v = array_shift($array)) !== null) { if (is_array($v)) { $array = array_merge($v, $array); } else { $tmp[] = $v; } } return $tmp; } aflavio
/** * Remove a value from a array * @param string $val * @param array $arr * @return array $array_remval */ function array_remval($val, &$arr) { $array_remval = $arr; for($x=0;$x<count($array_remval)-1;$x++) { $i=array_search($val,$array_remval); if($i===false)return false; $array_remval=array_merge(array_slice($array_remval, 0,$i), array_slice($array_remval, $i+1)); } return $array_remval; } $stack = array("orange", "banana", "apple", "raspberry", "apple"); output $stack = array("orange", "banana", "raspberry"); rajaratnam thavakumar--thava16
<?php /* This will return the N possible future dates acording to your selections of parameters mydates_array([Which Week in a Month],[Which Day in a Week],[No of Dates have to return]) Eg:- Every 2nd Sunday mydates_array(2,0,10) $Dateid---> Sunday - 0 , Monday - 1 , Tuesday - 2, Wednesday - 3, Thursday - 4 , Friday - 5 , Saturday - 6 $weekid---> * can not be greater than 6 * if weekID is equal 6 it will return the Last Day of the weeek. * Eg:-mydates_array(6,1,10); * it will Returns 10 Last Mondays * Please note weekid 5 is not availble in all months.mydates_array will not returns $no_returns that you want. * Eg:-mydates_array(5,1,10); * it will Returns 5th Monday $no_returns--> No of dates that you want By: Rajaratnam Thavakumar(thava16@hotmail.com) */ function mydates_array($weekid,$Dateid,$no_returns){ if($weekid<=6){ $todayweek = date("D"); $myarr=array("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); for($k=0;$k<=6;$k++){ if ($todayweek==$myarr[$k]){ if($k==0){ $currentdate=0; }else{ $currentdate=$k; } } } //get Dateid ---------------- if($Dateid==0){ $Newmyday=date("d")-$currentdate; }else if ($Dateid==1){ $Newmyday=date("d")-($currentdate-1); }else if ($Dateid==2){ $Newmyday=date("d")-($currentdate-2); }else if ($Dateid==3){ $Newmyday=date("d")-($currentdate-3); }else if ($Dateid==4){ $Newmyday=date("d")-($currentdate-4); }else if ($Dateid==5){ $Newmyday=date("d")-($currentdate-5); }else if ($Dateid==6){ $Newmyday=date("d")-($currentdate-6); } $thisweekId=$weekid; $count=0; $column=0; $myval=$no_returns*5; for($i=1; $i<=$myval; $i++){ $week1a = mktime(0, 0, 0, date("m"), $Newmyday, date("Y")); $week123=strftime("%Y-%m-%d", $week1a); $Newmyday=$Newmyday+7; list ($iyear, $imonth, $idate) = split ('[-.-]', $week123); //Insert Dates into Array if( $idate<10){ $idate=trim(str_replace('0','',$idate)); } $myweekno=ceil(($idate + date("w",mktime(0,0,0,$imonth,0,$iyear)))/7); $row=$myweekno-1; $Mymonth[$i]=$imonth; if ($i>1){ if ($Mymonth[$i-1]!=$Mymonth[$i]){ $column=$column+1; } } $EveDates[$row][$column]=$week123; } $count=0; for ( $column = 0; $column < $no_returns; $column++ ){ //--for1----- $mynewcount=0; for($row = 0; $row < 6; $row++){ //--for2----- if($EveDates[$row][$column]!="" && $thisweekId!=6){ list ($iyear1, $imonth1, $idate1) = split ('[-.-]', $EveDates[$row][$column]); $myweekno=ceil(($idate1 + date("w",mktime(0,0,0,$imonth1,0,$iyear1)))/7); if($myweekno==$thisweekId+1){ $week_n1= mktime(0, 0, 0, date("m"), date("d"), date("Y")); $week_m1=strftime("%Y-%m-%d", $week_n1); if($count < $no_returns && $EveDates[$row][$column] >= $week_m1){ $mydates_array[$count]=$EveDates[$row][$column]; } $count=$count+1; } } else{ $mycount=0; if ($row==5 && $thisweekId==6){ for($e=5; $e>=0; $e--){ if($EveDates[$e][$column]!=""){ break; } } $week_n1= mktime(0, 0, 0, date("m"), date("d"), date("Y")); $week_m1=strftime("%Y-%m-%d", $week_n1); if($mycount<$no_returns && $EveDates[$e][$column] >= $week_m1){ $mydates_array[$count]=$EveDates[$e][$column]; } $mycount=$mycount+1; $count=$count+1; } } } //--End of for2----- } //--End of for1----- return $mydates_array; }else{ echo('WeekID Cant be more than six!'); }} ?> <select name="eventDate" style="border:1 solid #000066" > <? // Return 10 Every 2nd Monday dates $myarray=mydates_array(6,5,10); for ($i=0;$i<count($myarray);$i++){ list ($iyear, $imonth, $idate) = split ('[-.-]', $myarray[$i]); $week1a = mktime(0, 0, 0,$imonth, $idate, $iyear); $week= strftime("%A %d %B %Y", $week1a); ?> <option value="<?=$myarray[$i]?>"><?=$week?></option> <? }?> </select> g8z
<?php /** filter_by_occurrence scans an array, and depending on the $exclusive parameter, includes or excludes elements occuring at least $min_occurences times, and at most $max_occurances times. parameters: $data_set = the array to work on $min_occurrences = the minimum number of occurrences $max_occurrences = the maximum number of occurrences (zero for unlimited) $exclusive = if true, will return only results that do not occur within the specified bounds Courtesy of the $5 Script Achive: http://www.tufat.com **/ function filter_by_occurrence ($data_set, $min_occurrences, $max_occurrences = 0, $exclusive = false) { $results = array(); // iterate through unique elements foreach (array_unique($data_set) as $value) { // count how many times element is in the array $count = 0; foreach ($data_set as $element) { if ($element == $value) $count++; } // check if meets min_occurences $is_in_range = false; if ($count >= $min_occurrences) { // check if meets max_occurrences (unless max_occurences is 0) if ( $count <= $max_occurrences || $max_occurrences == 0) $is_in_range = true; } // add item to array if appropriate if ($is_in_range && !$exclusive) array_push($results, $value); if (!$is_in_range && $exclusive) array_push($results, $value); } // return results return $results; } // EXAMPLE: $test_data = array('pizza', 'ham', 'pizza', 'pizza', 'ham', 'fish', 'fish', 'fish', 'fish', 'dinosaur'); foreach (filter_by_occurrence( $test_data, 3, 0, false ) as $value) { print $value . ' occurs at least 3 times. <br />'; } ?> kazuyoshi tlacaelel
<?php /** * converts a multidimensional array to a flat array * * trying to keep the original names of the keys * if repeated keys are found a hash will be added to the * keys trying to keep as much as possible of the original * key context * * september 30 2007 * * PHP version 5 * * @license GPL * */ $array = array ( 0 => array ( 0 => 1, 1 => 2, 2 => array ( 0 => 3, 1 => 4, 2 => array ( 0 => 5, 1 => 6, 2 => array ( 0 => 7, 1 => 8,),),), 3 => array ( 0 => array ( 0 => 9, 1 => 10, 2 => array ( 0 => 11, 1 => 12, 2 => array ( 0 => 13, 1 => 14, 2 => array ( 0 => 15, 1 => 16,),),),), 1 => array ( 0 => 17, 1 => 18,),),), 1 => array ( 0 => 19, 1 => 20,), 2 => array ( 0 => array ( 0 => 21, 1 => 22, 2 => array ( 0 => 23, 1 => 24, 2 => array ( 0 => 25, 1 => 26, 2 => array ( 0 => 27, 1 => 28,),),),), 1 => array ( 0 => 29, 1 => 30,),),); /** * transforms a multidimensional array to a flat array * * the parameter is referenced * so no returning value is needed * @param array $array the multidimensional array to flat * @return void */ function array_flatten(&$array) { function has_arrays($array) { foreach ($array as $item) { if (is_array($item)) { return true; } } return false; } function copy_array(&$array, $array_key) { $array2 = $array[$array_key]; unset($array[$array_key]); foreach ($array2 as $subkey => $subvalue) { if (array_key_exists($subkey, $array)) { $array[generate_unique_key($subkey)] = $subvalue; } else { $array[$subkey] = $subvalue; } } } function generate_unique_key($key) { if (strlen($key)>8) { $key = $key[0] . $key[1] . $key[2]; } $id = $key . '_'; $uid = uniqid(); $len = strlen($uid); $max = (9 - strlen($key)); for ($c = $len; ; $c --) { $id .= $uid[$c]; if ($c == ($len - $max)) { break; } } return $id; } function get_array_indexes($array) { $ret_array = array(); foreach ($array as $key => $value) { if (is_array($value)) { $ret_array[] = $key; } } return $ret_array; } while(has_arrays($array)) { foreach (get_array_indexes($array) as $key) { copy_array($array, $key); } } } array_flatten($array); array_multisort($array); var_export($array); /** * OUTPUT * * array ( * 0 => 1, * '1_403767b6' => 2, * '0_793767b6' => 3, * '1_8a3767b6' => 4, * '0_454767b6' => 5, * '1_564767b6' => 6, * '0_035767b6' => 7, * '1_345767b6' => 8, * '0_e74767b6' => 9, * '1_f84767b6' => 10, * '0_855767b6' => 11, * '1_a65767b6' => 12, * '0_4e5767b6' => 13, * '1_6f5767b6' => 14, * '0_566767b6' => 15, * '1_876767b6' => 16, * '0_5b4767b6' => 17, * '1_6c4767b6' => 18, * '0_d43767b6' => 19, * 1 => 20, * '0_4e3767b6' => 21, * '1_5f3767b6' => 22, * '0_ad4767b6' => 23, * '1_ce4767b6' => 24, * '0_485767b6' => 25, * '1_695767b6' => 26, * '0_116767b6' => 27, * '1_426767b6' => 28, * '0_814767b6' => 29, * '1_924767b6' => 30, * ) */ ?> sid dot pasquale
<?php /* This function allow you to transform a multidimensional array in a simple monodimensional array. Usage: array_walk($oldarray, 'flatten_array', &$newarray); For example, this code below shows to you: Array ( [1] => Array ( [0] => 1 [1] => 2 ) [2] => Array ( [0] => 3 [1] => 4 ) ) Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) */ function flatten_array($value, $key, &$array) { if (!is_array($value)) array_push($array,$value); else array_walk($value, 'flatten_array', &$array); } $oldarray = array( 1 => array(1,2), 2 => array(3,4) ); $newarray = array(); array_walk($oldarray, 'flatten_array', &$newarray); echo "<pre>"; print_r($oldarray); print_r($newarray); echo "</pre>"; ?> za
<?php // Swap 2 elements in array preserving keys. function array_swap(&$array,$key1,$key2) { $v1=$array[$key1]; $v2=$array[$key2]; $out=array(); foreach($array as $i=>$v) { if($i==$key1) { $i=$key2; $v=$v2; } else if($i==$key2) { $i=$key1; $v=$v1; } $out[$i]=$v; } return $out; } // Move an element inside an array preserving keys. function array_move(&$array,$key,$position) { $from=array_search($key,array_keys($array)); $to=$from+$position; $tot=count($array); if($position>0) $to++; if($to<0) $to=0; else if($to>=$tot) $to=$tot-1; $n=0; $out=array(); foreach($array as $i=>$v) { if($n==$to) $out[$key]=$array[$key]; if($n++==$from) continue; $out[$i]=$v; } return $out; } ?> kroczu
<? //A little function to convert array to simle xml: function array_xml($array, $num_prefix = "num_") { if(!is_array($array)) // text { return $array; } else { foreach($array as $key=>$val) // subnode { $key = (is_numeric($key)? $num_prefix.$key : $key); $return.="<".$key.">".array_xml($val, $num_prefix)."</".$key.">"; } } return $return; } //example: $array[0][0] = 1; $array[0]['test'] = "test"; $array['test1']['test2'] = "test"; $array['test'][0] = "test"; $array['test'][1]['test_x'] = $array; print_r($array); print"<xml>"; print array_xml($array); print"</xml>"; /* print_r($array) previev: Array ( [0] => Array ( [0] => 1 [test] => test ) [test1] => Array ( [test2] => test ) [test] => Array ( [0] => test [1] => Array ( [test_x] => Array ( [0] => Array ( [0] => 1 [test] => test ) [test1] => Array ( [test2] => test ) [test] => Array ( [0] => test ) ) ) ) ) result xml in firefox preview: -<xml> - <num_0> <num_0>1</num_0> <test>test</test> </num_0> - <test1> <test2>test</test2> </test1> - <test> <num_0>test</num_0> - <num_1> - <test_x> - <num_0> <num_0>1</num_0> <test>test</test> </num_0> - <test1> <test2>test</test2> </test1> - <test> <num_0>test</num_0> </test> </test_x> </num_1> </test> </xml> */ ?> |
Change Language.NET Functions Apache-specific Functions Alternative PHP Cache Advanced PHP debugger Array Functions Aspell functions [deprecated] BBCode Functions BCMath Arbitrary Precision Mathematics Functions PHP bytecode Compiler Bzip2 Compression Functions Calendar Functions CCVS API Functions [deprecated] Class/Object Functions Classkit Functions ClibPDF Functions [deprecated] COM and .Net (Windows) Crack Functions Character Type Functions CURL Cybercash Payment Functions Credit Mutuel CyberMUT functions Cyrus IMAP administration Functions Date and Time Functions DB++ Functions Database (dbm-style) Abstraction Layer Functions dBase Functions DBM Functions [deprecated] dbx Functions Direct IO Functions Directory Functions DOM Functions DOM XML Functions enchant Functions Error Handling and Logging Functions Exif Functions Expect Functions File Alteration Monitor Functions Forms Data Format Functions Fileinfo Functions filePro Functions Filesystem Functions Filter Functions Firebird/InterBase Functions Firebird/Interbase Functions (PDO_FIREBIRD) FriBiDi Functions FrontBase Functions FTP Functions Function Handling Functions GeoIP Functions Gettext Functions GMP Functions gnupg Functions Net_Gopher Haru PDF Functions hash Functions HTTP Hyperwave Functions Hyperwave API Functions i18n Functions IBM Functions (PDO_IBM) IBM DB2 iconv Functions ID3 Functions IIS Administration Functions Image Functions Imagick Image Library IMAP Informix Functions Informix Functions (PDO_INFORMIX) Ingres II Functions IRC Gateway Functions PHP / Java Integration JSON Functions KADM5 LDAP Functions libxml Functions Lotus Notes Functions LZF Functions Mail Functions Mailparse Functions Mathematical Functions MaxDB PHP Extension MCAL Functions Mcrypt Encryption Functions MCVE (Monetra) Payment Functions Memcache Functions Mhash Functions Mimetype Functions Ming functions for Flash Miscellaneous Functions mnoGoSearch Functions Microsoft SQL Server Functions Microsoft SQL Server and Sybase Functions (PDO_DBLIB) Mohawk Software Session Handler Functions mSQL Functions Multibyte String Functions muscat Functions MySQL Functions MySQL Functions (PDO_MYSQL) MySQL Improved Extension Ncurses Terminal Screen Control Functions Network Functions Newt Functions NSAPI-specific Functions Object Aggregation/Composition Functions Object property and method call overloading Oracle Functions ODBC Functions (Unified) ODBC and DB2 Functions (PDO_ODBC) oggvorbis OpenAL Audio Bindings OpenSSL Functions Oracle Functions [deprecated] Oracle Functions (PDO_OCI) Output Control Functions Ovrimos SQL Functions Paradox File Access Parsekit Functions Process Control Functions Regular Expression Functions (Perl-Compatible) PDF Functions PDO Functions Phar archive stream and classes PHP Options&Information POSIX Functions Regular Expression Functions (POSIX Extended) PostgreSQL Functions PostgreSQL Functions (PDO_PGSQL) Printer Functions Program Execution Functions PostScript document creation Pspell Functions qtdom Functions Radius Rar Functions GNU Readline GNU Recode Functions RPM Header Reading Functions runkit Functions SAM - Simple Asynchronous Messaging Satellite CORBA client extension [deprecated] SCA Functions SDO Functions SDO XML Data Access Service Functions SDO Relational Data Access Service Functions Semaphore SESAM Database Functions PostgreSQL Session Save Handler Session Handling Functions Shared Memory Functions SimpleXML functions SNMP Functions SOAP Functions Socket Functions Standard PHP Library (SPL) Functions SQLite Functions SQLite Functions (PDO_SQLITE) Secure Shell2 Functions Statistics Functions Stream Functions String Functions Subversion Functions Shockwave Flash Functions Swish Functions Sybase Functions TCP Wrappers Functions Tidy Functions Tokenizer Functions Unicode Functions URL Functions Variable Handling Functions Verisign Payflow Pro Functions vpopmail Functions W32api Functions WDDX Functions win32ps Functions win32service Functions xattr Functions xdiff Functions XML Parser Functions XML-RPC Functions XMLReader functions XMLWriter Functions XSL functions XSLT Functions YAZ Functions YP/NIS Functions Zip File Functions Zlib Compression Functions |