Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
PHP: 配列関数(array) - Manual
[go: Go Back, main page]

PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

array_change_key_case" width="11" height="7"/> <rename_function
Last updated: Thu, 31 May 2007

view this page in

V. 配列関数(array)

導入

これらの関数により様々な手法で配列にアクセスし、操作することが可能 になります。配列は、変数の組を保存、管理、操作する基本的な要素です。

通常の配列および多次元配列がサポートされており、ユーザが定義したり、 他の関数で作成することも可能です。いくつかのデータベース処理関数は、 データベースのクエリから配列を返しますし、いくつかの関数は配列を返 します。

PHPでの配列の実装や使用方法の詳細については、マニュアルの 配列に関する節を参照下 さい。 その他の配列の操作方法については、 配列演算子も 参照ください。

要件

外部ライブラリを必要としません。

インストール手順

PHP コアに含まれるため、 追加のインストール無しで使用できます。

実行時設定

設定ディレクティブは定義されていません。

リソース型

リソース型は定義されていません。

定義済み定数

以下の定数は、PHP コアに含まれており、常に利用可能です。

CASE_LOWER (integer)
CASE_LOWERは、 array_change_key_case()で使用され、 配列のキーを小文字に変換するために使用されます。小文字は、 array_change_key_case()のデフォルトのケースで もあります。
CASE_UPPER (integer)
CASE_UPPERは、 array_change_key_case()で使用され、配列のキー を大文字に変換するために使用されます。

ソース順のフラグ:

SORT_ASC (integer)
SORT_ASCは、 array_multisort()でソート順を昇順にするために 使用されます。
SORT_DESC (integer) (integer)
SORT_DESCは、 array_multisort()でソート順を降順にするために 使用されます。

ソート型のフラグ: 種々のソート関数で使用されます

SORT_REGULAR (integer)
SORT_REGULARは通常の比較するために使用され ます。
SORT_NUMERIC (integer)
SORT_NUMERICは数値で比較を行うために使用さ れます。
SORT_STRING (integer)
SORT_STRINGは文字列として比較を行うために使 用されます。
SORT_LOCALE_STRING (integer)
SORT_LOCALE_STRINGは現在のロケールに基づいた 文字列として比較を行うために使用されます。 PHP 4.4.0と5.0.2で追加 されました。

COUNT_NORMAL (integer)
COUNT_RECURSIVE (integer)
EXTR_OVERWRITE (integer)
EXTR_SKIP (integer)
EXTR_PREFIX_SAME (integer)
EXTR_PREFIX_ALL (integer)
EXTR_PREFIX_INVALID (integer)
EXTR_PREFIX_IF_EXISTS (integer)
EXTR_IF_EXISTS (integer)
EXTR_REFS (integer)

参考

is_array(), explode(), implode(), split(), preg_split(), および join() も参照してください。

目次

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_keys — キーを指定して、配列を値で埋める
array_fill — 配列を指定した値で埋める
array_filter — コールバック関数を使用して、配列の要素をフィルタリングする
array_flip — 配列のキーと値を反転する
array_intersect_assoc — 追加された添字の確認も含めて配列の共通項を確認する
array_intersect_key — キーを基準にして配列の共通項を計算する
array_intersect_uassoc — 追加された添字の確認も含め、コールバック関数を用いて 配列の共通項を確認する
array_intersect_ukey — キーを基準にし、コールバック関数を用いて 配列の共通項を計算する
array_intersect — 配列の共通項を計算する
array_key_exists — 指定したキーまたは添字が配列にあるかどうかを調べる
array_keys — 配列のキーをすべて返す
array_map — 指定した配列の要素にコールバック関数を適用する
array_merge_recursive — 二つ以上の配列を再帰的にマージする
array_merge — ひとつまたは複数の配列をマージする
array_multisort — 複数の多次元の配列をソートする
array_pad — 指定長、指定した値で配列を埋める
array_pop — 配列の末尾から要素を取り除く
array_product — 配列の値の積を計算する
array_push — 一つ以上の要素を配列の最後に追加する
array_rand — 配列から一つ以上の要素をランダムに取得する
array_reduce — コールバック関数を用いて配列を普通の値に変更することにより、 配列を再帰的に減らす
array_reverse — 要素を逆順にした配列を返す
array_search — 指定した値を配列で検索し、見つかった場合に対応するキーを返す
array_shift — 配列の先頭から要素を一つ取り出す
array_slice — 配列の一部を展開する
array_splice — 配列の一部を削除し、他の要素で置換する
array_sum — 配列の中の値の合計を計算する
array_udiff_assoc — データの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
array_udiff_uassoc — データと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
array_udiff — データの比較にコールバック関数を用い、配列の差を計算する
array_uintersect_assoc — データの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
array_uintersect_uassoc — データと添字の比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
array_uintersect — データの比較にコールバック関数を用い、配列の共通項を計算する
array_unique — 配列から重複した値を削除する
array_unshift — 一つ以上の要素を配列の最初に加える
array_values — 配列の全ての値を返す
array_walk_recursive — 配列の全ての要素に、ユーザー関数を再帰的に適用する
array_walk — 配列の全ての要素にユーザ関数を適用する
array — 配列を生成する
arsort — 連想キーと要素との関係を維持しつつ配列を逆順にソートする
asort — 連想キーと要素との関係を維持しつつ配列をソートする
compact — 変数名とその値から配列を作成する
count — 変数に含まれる要素、 あるいはオブジェクトに含まれるプロパティの数を数える
current — 配列内の現在の要素を返す
each — 配列から、次のキーと値のペアを返す
end — 配列の内部ポインタを最終要素にセットする
extract — 配列からシンボルテーブルに変数をインポートする
in_array — 配列に値があるかチェックする
key — 連想配列からキーを取り出す
krsort — 配列をキーで逆順にソートする
ksort — 配列をキーでソートする
list — 配列と同様の形式で、複数の変数への代入を行う
natcasesort — 大文字小文字を区別しない"自然順"アルゴリズムを用いて配列をソートする
natsort — "自然順"アルゴリズムで配列をソートする
next — 内部配列ポインタを進める
poscurrent() のエイリアス
prev — 内部の配列ポインタをひとつ前に戻す
range — ある範囲の整数を有する配列を作成する
reset — 配列の内部ポインタを先頭の要素にセットする
rsort — 配列を逆順にソートする
shuffle — 配列をシャッフルする
sizeofcount() のエイリアス
sort — 配列をソートする
uasort — ユーザー定義の比較関数で配列をソートし、連想インデックスを保持する
uksort — ユーザー定義の比較関数を用いて、キーで配列をソートする
usort — ユーザー定義の比較関数を使用して、配列を値でソートする


add a note add a note User Contributed Notes
配列関数(array)
Kazuyoshi Tlacaelel
30-Aug-2007 03:56
<?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,
     *  )
     */
?>
bloody
19-Aug-2007 09:42
i have one input field,iwant two input fields when they are submit they are saved in a .txt file but among one another..

if submit then the second field is supposed to be stored always behind the first

 .txt file:
hello(first field) nice weather(second field)
yeah(first field) it is (second field)

can some one help me
pedja at uzice dot net
07-Aug-2007 09:38
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
                        )

                )

        )

)

?>
mo dot longman at gmail dot com
31-Jul-2007 03:27
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.
g4wx3
19-Jul-2007 06:16
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") , '<br>' , $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
shufty at gmail dot com
19-Jul-2007 11:20
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;
    }
?>
phamphong_tn at yahoo dot com
29-Jun-2007 08:34
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);
?>
peanutpad at msn dot com
16-Jun-2007 07:15
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);
}
webdev at svbeatrix dot com
12-Jun-2007 01:06
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));
}
sean at aliencreations dot com
10-Jun-2007 08:36
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)";
sid dot pasquale at gmail dot com
30-May-2007 06:57
<?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>";
?>
djspy187 at gmail dot com
17-May-2007 06:05
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']
frando
26-Apr-2007 11:14
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;
}
?>
Q1712 at online dot ms
23-Apr-2007 10:34
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
info at dyflexis dot nl
18-Apr-2007 05:13
A modernized version of the flatten_array() functies written by

davidj at boundlessgallery dot DISLIKESPAM dot com
on 02-Apr-2004 03:10

This function is able to work with associative arrays

<?php
function flatten_array($array) {
    
$size=sizeof($array);
    
$keys=array_keys($array);
    for(
$x = 0; $x < $size; $x++) {
        
$element = $array[$keys[$x]];

        if(
is_array($element)) {
           
$results = flatten_array($element);
               
$sr = sizeof($results);
               
$sk=array_keys($results);
            for(
$y = 0; $y < $sr; $y++) {
               
$flat_array[$sk[$y]] = $results[$sk[$y]];
            }
        } else {
           
$flat_array[$keys[$x]] = $element;
        }
    }

    return
$flat_array;
}
?>
psbrogna at yahoo dot com
18-Apr-2007 12:12
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).
wmakend at intershop dot de
05-Apr-2007 06:41
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]."<br>";
            }     
}
info at joolee dot nl
19-Mar-2007 09:49
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;
}
?>
Vladson
15-Mar-2007 12:18
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);
}
?>
piotr dot galas+phpnet at gmail dot com
14-Mar-2007 07:57
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;
}
aflavio at gmail dot com
02-Mar-2007 06:45
/* Correcting me last post */

/**
    * 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);$x++)
          {
              $i=array_search($val,$array_remval);
              if (is_numeric($i)) {
                  $array_temp  = array_slice($array_remval, 0, $i );
                $array_temp2 = array_slice($array_remval, $i+1, count($array_remval)-1 );
                $array_remval = array_merge($array_temp, $array_temp2);
              }
          }
          return $array_remval;
    }

$stack=Array('apple','banana','pear','apple', 'cherry', 'apple');
array_remval("apple", $stack);

//output: Array('banana','pear', 'cherry')
aflavio at gmail dot com
01-Mar-2007 04:29
/**
    * 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");
rune at zedeler dot dk
28-Feb-2007 01:42
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';
?>
admin \x40 uostas.net
23-Feb-2007 01:09
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');
?>
christian at enovo dot dk
18-Feb-2007 09:03
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;
    }
Colin
10-Feb-2007 02:31
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'
hannes dot dahlberg at gmail dot com
06-Feb-2007 10:12
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;
}
dkrysiak at o2 dot pl
02-Feb-2007 05:40
// 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)
*/
?>
Mark Lindeman
17-Jan-2007 07:10
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
)
php_spam {at] erif dot org
29-Dec-2006 03:52
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;
  }

?>
filip at mxd dot biz
20-Dec-2006 06:59
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;
    }
simone dot carletti at unimc dot it
29-Nov-2006 12:09
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
elkabong at samsalisbury dot co dot uk
13-Nov-2006 08:43
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!
zspencer at zacharyspencer dot com
01-Nov-2006 11:59
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;
   
}
?>
sneskid at hotmail dot com
24-Oct-2006 10:30
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
r2rien at gmail dot com
16-Oct-2006 09:06
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
)
kthejoker - google mail
21-Sep-2006 02:00
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.
jeremyquinton at gmail dot com
31-Aug-2006 07:20
//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
ob at babcom dot biz
29-Aug-2006 12:18
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.
ob at babcom dot biz
28-Aug-2006 09:56
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;
}
?>
ob at babcom dot biz
28-Aug-2006 08:23
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;
}
?>
ob at babcom dot biz
28-Aug-2006 08:18
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;
}
?>
sergio at {NO_SPAM_PLEASE]inservibile dot org
16-Aug-2006 09:17
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
Nicolai Bloch
11-Aug-2006 04:51
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));
}
?>
za at byza dot it
21-Jul-2006 12:52
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);
}
?>
g8z at yahoo dot com
20-Jul-2006 05:42
<?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 />';
}

?>
nick
11-Jul-2006 09: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 10:53
<?
//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>

*/
?>
vinaur at gmail dot com
07-Jun-2006 05: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
28-May-2006 04: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); }

   
//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;
  }

?>
ben
14-Apr-2006 06: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
03-Apr-2006 07: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 09: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>&nbsp;</td>\n";
        }
       
$retval.=" </tr>\n";
    }   
    return
$retval."</table>\n";
}

?>
more scripts at http://www.sphoera.com
elkabong at samsalisbury dot co dot uk
25-Mar-2006 07: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 # 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!
alessandronunes at gmail dot com
19-Mar-2006 07: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
15-Mar-2006 02:08
Re removing blank elements from arrays, this is even more concise:

<?php

$arraytest
= array_diff($arraytest, array(""));

?>
Nimja
24-Feb-2006 12: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
06-Feb-2006 05: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
01-Feb-2006 07: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
20-Jan-2006 02: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
10-Jan-2006 10: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
04-Jan-2006 10: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
02-Jan-2006 01: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 11: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
25-Nov-2005 02: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 06: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
25-Oct-2005 12:16
<?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, 0date("m"), $Newmydaydate("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>
msajko at gmail dot com
19-Oct-2005 05: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
18-Oct-2005 10: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
14-Oct-2005 10: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

// 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;
}

?>
aidan at php dot net
09-Oct-2005 05:32
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
za at lombardiacom dot it
28-Sep-2005 12:01
<?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;
    }
?>
Domenic Denicola
16-Aug-2005 03: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)
{
   
// 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.
dieter peeters
11-Aug-2005 08: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)) { // 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;
}
?>
michael at imreo com
21-Jul-2005 09: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
09-Jul-2005 05: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

// 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>';

?>
m227(a)poczta.onet.pl
21-Jan-2005 01: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.
01-Feb-2004 06:29
To remove an element from an array use unset(). Example:
unset($bar['mushroomsoup']);

 
show source | credits | sitemap | contact | advertising | mirror sites