|
 |
V. Функции для работы с массивами
Эти функции позволят вам различными способами оперировать
с массивами. Массивы идеально подходят для хранения,
изменения и работы с наборами переменных.
Поддерживаются одно- и многоразмерные массивы, как созданные
пользователем, так и возвращенные в качестве результата
какой-либо функцией. Существуют специальные функции
для работы с базами данных, облегчающие работу
с массивами данных, возвращаемых в результате выполнения запросов;
также существуют функции, возвращающие массивы в качестве результата.
Чтобы получить больше сведений о том, каким образом создаются
и используются массивы в PHP, обратитесь к главе
Массивы данного
руководства.
Эти функции всегда доступны. Для использования этих функций не требуется проведение установки,
поскольку они являются частью ядра PHP. Данное расширение не определяет никакие директивы конфигурации в php.ini. Данное расширение не определяет никакие типы ресурсов.
Перечисленные ниже константы всегда доступны как часть ядра PHP.
- Содержание
- array_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 -- Заполнить массив определенным значением
- 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 --
Отсортировать массив, используя алгоритм "natural order" не принимая во внимание регистр символов
- natsort --
Отсортировать массив, используя алгоритм "natural order"
- next --
Передвинуть внутренний указатель массива на одну позицию вперёд
- pos -- Alias of current()
- prev -- Передвинуть внутренний указатель массива на одну позицию назад
- range --
Создать массив, содержащий диапазон элементов
- reset --
Установить внутренний указатель массива на его первый элемент
- rsort -- Отсортировать массив в обратном порядке
- shuffle -- Перемешать массив
- sizeof -- Alias of count()
- sort -- Отсортировать массив
- uasort --
Отсортировать массив, используя пользовательскую функцию для сравнения элементов
с сохранением ключей
- uksort --
Отсортировать массив по ключам, используя пользовательскую функцию для сравнения ключей
- usort --
Отсортировать массив по значениям используя пользовательскую функцию для
сравнения элементов
Функции для работы с массивами
nick
11-Jul-2006 05:46
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;
}
?>
kroczu at interia dot pl
06-Jul-2006 06:53
<?
function array_xml($array, $num_prefix = "num_")
{
if(!is_array($array)) {
return $array;
}
else
{
foreach($array as $key=>$val) {
$key = (is_numeric($key)? $num_prefix.$key : $key);
$return.="<".$key.">".array_xml($val, $num_prefix)."</".$key.">";
}
}
return $return;
}
$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>";
?>
vinaur at gmail dot com
06-Jun-2006 01:36
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;
}
?>
php_spam at erif dot org
27-May-2006 12:15
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); }
$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.'"];';
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;
}
?>
ben
13-Apr-2006 02:59
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().
g dot bell at NOSPAM dot managesys dot com dot au
02-Apr-2006 03:57
/*
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;
}
administrador(ensaimada)sphoera(punt)com
31-Mar-2006 04:37
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
elkabong at samsalisbury dot co dot uk
24-Mar-2006 02:31
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 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;
}
}
}
$my_lovely_reference_free_array = array();
array_deep_copy($my_array_full_of_references, $my_lovely_reference_free_array);
?>
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!
alessandronunes at gmail dot com
18-Mar-2006 02:06
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;
}
padraig at NOSPAM dot ohannelly dot com
14-Mar-2006 09:08
Re removing blank elements from arrays, this is even more concise:
<?php
$arraytest = array_diff($arraytest, array(""));
?>
Nimja
23-Feb-2006 07:35
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;
}
?>
eddypearson at gmail dot com
05-Feb-2006 12:40
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;
}
Sebastian
31-Jan-2006 02:58
xxellisxx at gmail dot com:
see implode(), it does exactly what you want, but quicker.
$array = array();
$string = implode( '', $array );
xxellisxx at gmail dot com
19-Jan-2006 09:03
Super simple way of converting an array to a string.
function array_to_string($array)
{
foreach ($array as $index => $val)
{
$val2 .=$val;
}
return $val2;
}
spam at madhermit dot net
09-Jan-2006 05:26
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;
}
?>
Atomo64
03-Jan-2006 05:14
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;
}
}
?>
ryan1_00 at hotmail dot com
01-Jan-2006 08:02
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
jonathan at sharpmedia dot net
05-Dec-2005 06:37
/**
* 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;
}
madness AT l33t DOT it
24-Nov-2005 09:18
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.
stalker at ruun dot de
20-Nov-2005 01:15
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
Rajaratnam Thavakumar--thava16 at gmail dot com
24-Oct-2005 08:16
<?php
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;
}
}
}
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);
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++ ){ $mynewcount=0;
for($row = 0; $row < 6; $row++){ 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;
}
}
} } return $mydates_array;
}else{
echo('WeekID Cant be more than six!');
}}
?>
<select name="eventDate" style="border:1 solid #000066" >
<? $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>
msajko at gmail dot com
19-Oct-2005 01:25
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;
}
phpnet_spam at erif dot org
17-Oct-2005 06:36
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);
}
designatevoid at gmail dot com
13-Oct-2005 06:40
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
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));
}
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;
}
?>
za at lombardiacom dot it
27-Sep-2005 08:01
<?php
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;
}
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;
}
?>
Domenic Denicola
15-Aug-2005 11:49
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)
{
if(! is_array($array) )
{
if ($array === null)
{
return 'null';
}
return '"' . $array . '"';
}
$retVal = "{";
$first = true;
foreach($array as $key => $value)
{
if (! $first )
{
$retVal .= ', ';
}
$first = false;
if (is_string($key) )
{
$key = '"' . $key . '"';
}
$retVal .= $key . ' : ' . PhpArrayToJsObject_Recurse($value);
}
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.
dieter peeters
11-Aug-2005 04:35
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)) { $result = $name.' = new Array();'."\n";
foreach ($array as $key => $value) {
$result .= phpArrayToJsArray($name.'["'.$key.'"]',$value,'');
}
} else { $result = $name.' = "'.$array.'";'."\n";
}
return $prePend.$result;
}
?>
michael at imreo com
21-Jul-2005 05:20
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;
}
?>
daenders AT yahoo DOT com
08-Jul-2005 01:49
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
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));
}
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;
}
$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>';
?>
casey geene
30-Apr-2005 03:14
Handy function to walk through an array to get an offset with a given path.
<?php
function &array_path(&$array, $path) {
if(!is_array($array)) {
trigger_error('array_path(): First argument should be an array', E_USER_WARNING);
}
settype($path, 'array');
$offset =& $array;
foreach ($path as $index) {
if (!isset($offset[$index])) {
trigger_error("Undefined offset: $index");
return false;
}
$offset =& $offset[$index];
}
return $offset;
}
$a = array(
1 => array(
2 => array(
3 => 'hi'
)
)
);
echo array_path($a, array(1, 2, 3));
$ref =& array_path($a, array(1, 2));
$ref = array('hello');
?>
garis at intec dot edu dot do
29-Apr-2005 08:55
this array are always used on form querys... is a nice way to simplify the date inputs
<?php
$dia = array('', 'Lunes','Martes','Miercoles','Jueves','Viernes','Sabado', 'Domingo');
$mes = array('', 'Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre');
?>
and you call monday like $dia['1']...
i used it on a form, that have a lot of date inputs, cuz i wanted to minimize the size of my file..
admin at snibworks dot com
20-Apr-2005 08:40
I have made a new array function called array_split.
It's like explode() for arrays. It searches the array for a specific value and splits the array into chunks divided by that value.
<?php
function array_split($key, $array)
{
if(!is_array($array))trigger_error("Invalid type provided for
second parameter of array_split",E_USER_ERROR);
$rarray = array();
$curkey = 0;
foreach($array as $value)
{
if($value == $key)
{
$curkey++;
continue;
}
$rarray[$curkey][] = $value;
}
return $rarray;
}
$new_array = array('one','two','break','three',
'break','four','five','six');
var_dump(array_split('break',$new_array));
?>
ktaufik(at)gmail(dot)com
16-Feb-2005 04:31
For you who works for localized "say" number to letter ( ex , 7=> seven, 8=>eight) for Bahasa Indonesia.
Indonesia "say" or "Terbilang" is based on 3 digit number.
thousands, millions and trillions .... will be based on the 3 digit number.
In Indonesia you say 137 as "Seratus Tiga Puluh Tujuh"
<?php
$x=rand(0,9);
$y=rand(0,9);
$z=rand(0,9);
function display_angka_bilangan($n) {
$angka = array(
1 => 'satu',
2 => 'dua',
3 => 'tiga',
4 => 'empat',
5 => "lima",
6 => 'enam',
7 => 'tujuh',
8 => 'delapan',
9 => 'sembilan'
);
return $angka[$n];
}
if ($x==1){$terbilangx="seratus ";}
elseif ($x==0){$terbilangx='';}
else {$terbilangx=''.display_angka_bilangan($x).' '.'ratus ';}
if ($y==0){$terbilangy='';}
elseif ($y==1 && $z==1){$terbilangy="sebelas";$terbilangz='';}
elseif ($y==1 && $z==0){$terbilangy="sepuluh ";$terbilangz='';}
elseif ($y==1 && $z!==1 && $z!==0){$terbilangy=''.display_angka_bilangan($z).' belas ';}
else {$terbilangy=''.display_angka_bilangan($y).' '.'puluh ';}
if ($z==0){$terbilangz="";}
elseif ($z==0 && $y==1){$terbilangz="";}
elseif ($z==1 && $y==1){$terbilangz="";}
elseif($y==0) {$terbilangz="".display_angka_bilangan($z);}
elseif ($y==1 && $z!==1 && $z!==0) {$terbilangz="";}
else {$terbilangz="".display_angka_bilangan($z);};
$terbilang=$terbilangx.$terbilangy.$terbilangz;
echo $x.$y.$z." ";
echo $terbilang;
?>
Hope it is useful
ktaufik(at)gmail(dot)com
tYZ
08-Feb-2005 01:53
In reply to zubfatal, root at it dot dk (25-Nov-2004 02:06):
Instead of writing all those functions you could also use:
array_avg: array_sum($arr) / sizeof($arr);
array_max: max($arr);
array_min: min($arr)
daniel _dot eherbert _at gmail _dot com
01-Feb-2005 09:52
i was unable to use normal means to shift an array element up or down, so i had to write a function to do it... i havent had the chance to test it, but the method is there...
<?
$stuff[0] = 'a';
$stuff[1] = 'b';
$stuff[2] = 'c';
$stuff[3] = 'd';
function array_shift($array,$value,$direction = 'up')
{
$temp = $array;
while ($array_value = current($array))
{
if ($array_value == $value)
{
$key = key($array);
break;
}
next($array);
}
if ( !isset($key) )
{
return false;
}
if ( $key == 0 && $direction == 'up' )
{
return $array;
}
if ( $key == (count($array)-1) && $direction == 'down' )
{
return $array;
}
switch ($direction)
{
case 'up':
$factor = -1;
break;
case 'down':
$factor = 1;
break;
}
$temp[$key+$factor] = $array[$key];
$temp[$key] = $array[$key+$factor];
return $temp;
}
?>
$stuff = array_shift($stuff,'c','up'); - will move c up and b down
$stuff = array_shift($stuff,'a','down'); - will move a down and b up
$stuff = array_shift($stuff,'a','up'); - will return the original array
$stuff = array_shift($stuff,'d','down'); - will return the original array
... if the element value could not be found it probably should return the original array instead of false...
m227(a)poczta.onet.pl
20-Jan-2005 08:18
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.
skopek at mediatac dot com
13-Oct-2004 03:44
I needed a function, that returns the cartesian product of some input-arrays in an array. Here is the function that can do that:
<?php
function array_cartesian_product($arrays) {
$cartesic = array();
$size=(sizeof($arrays)>0)?1:0;
foreach($arrays as $array)
{
$size= $size*sizeof($array);
}
for($i=0; $i<$size;$i++) {
$cartesic[$i] = array();
for($j=0;$j<sizeof($arrays);$j++)
{
$current = current($arrays[$j]);
array_push($cartesic[$i], $current);
}
for($j=(sizeof($arrays)-1);$j>=0;$j--)
{
if(next($arrays[$j])) {
break;
} else { reset($arrays[$j]);
}
}
}
return $cartesic;
}
$arrays[0] = array("a", "b");
$arrays[1] = array("x", "y", "z");
print_r(array_cartesian_product($arrays));
?>
The output is:
Array
(
[0] => Array
(
[0] => a
[1] => x
)
[1] => Array
(
[0] => a
[1] => y
)
[2] => Array
(
[0] => a
[1] => z
)
[3] => Array
(
[0] => b
[1] => x
)
[4] => Array
(
[0] => b
[1] => y
)
[5] => Array
(
[0] => b
[1] => z
)
)
Greets
Jan
davidj at boundlessgallery dot DISLIKESPAM dot com
01-Apr-2004 05:10
A recursive function for flattening nested arrays:
<?php
function flatten_array($array) {
for($x = 0; $x < sizeof($array); $x++) {
$element = $array[$x];
if(is_array($element)) {
$results = flatten_array($element);
for($y = 0; $y < sizeof($results); $y++) {
$flat_array[] = $results[$y];
}
} else {
$flat_array[] = $element;
}
}
return $flat_array;
}
?>
Example:
<?php
$array = array("0", "1", array("2", "3", array("4", array("5", "6"), "7", "8")), "9", "10", array("11"), array());
print_r($array);
print_r(flatten_array($array));
?>
Output:
Array
(
[0] => 0
[1] => 1
[2] => Array
(
[0] => 2
[1] => 3
[2] => Array
(
[0] => 4
[1] => Array
(
[0] => 5
[1] => 6
)
[2] => 7
[3] => 8
)
)
[3] => 9
[4] => 10
[5] => Array
(
[0] => 11
)
[6] => Array
(
)
)
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 8
[9] => 9
[10] => 10
[11] => 11
)
31-Jan-2004 01:29
To remove an element from an array use unset(). Example:
unset($bar['mushroomsoup']);
28-Aug-2003 06:09
Remember that if you want to remove an element from an array, you must use "unset" - Do not set the value to null.
szymon at mazurek dot info
24-Aug-2003 05:46
How to count dimensions in multi-array?
This is the way I do this:
function countdim($array) {
static $dimcount = 1;
if (is_array(reset($array))) {
$dimcount++;
$return = countdim(reset($array));
} else {
$return = $dimcount;
}
return $return;
}
This function will return int number of array dimensions.
| |