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

search for in the

Обекти> <Низове
Last updated: Fri, 27 Jun 2008

view this page in

Масиви

Масивът в PHP всъщност представлява подредена асоциация (ordered map). Асоциацията е тип, който асоциира стойности към ключове. Този тип е оптимизиран по няколко направления, така че можете да го използвате като реален масив, като списък (вектор), хеш-таблица (което е реализация на асоциация), речник, колекция, стек, опашка и др. Тъй като за стойност може да имате друг масив, много лесно можете да симулирате и дървета.

Описанието на тези структури от данни е извън обхвата на това ръководство, но ще намерите поне един пример за всяка от тях. За повече информация по тази обширна тема ви препоръчваме да се насочите към външна литература.

Синтаксис

Указване посредством array()

Масив може да бъде създаден посредством езиковата конструкция array(). Тя приема определено количество двойки ключ => стойност , разделени със запетаи.

array(  ключ =>  стойност
     , ...
     )
// ключът може да бъде цяло число или низ
// стойността може да бъде всякаква
      

<?php
$arr 
= array("foo" => "bar"12 => true);

echo 
$arr["foo"]; // bar
echo $arr[12];    // 1
?>

Ключът може да бъде или цяло число, или низ. Ако ключът е представен като обикновено цяло число, той ще бъде интерпретиран като такова (т.е. "8" ще се интерпретира като 8, докато "08" - като "08"). Плаващите числа в ключовете се съкращават до цели. В PHP не съществуват различни типове за индексирани и асоциативни масиви; има само един тип масив, който може да съдържа едновременно целочислени и низови индекси.

Стойността може да бъде от всякакъв тип.

<?php
$arr 
= array("somearray" => array(=> 513 => 9"a" => 42));

echo 
$arr["somearray"][6];    // 5
echo $arr["somearray"][13];   // 9
echo $arr["somearray"]["a"];  // 42
?>

Ако не укажете изрично ключ за дадена стойност, то ще се вземе най-голямата стойност от целочислените индекси и новият ключ ще бъде тази стойност + 1. Ако укажете ключ, който вече има присвоена стойност, то тази стойност ще бъде презаписана.

<?php
// Този масив е същият като ...
array(=> 433256"b" => 12);

// ...този.
array(=> 43=> 32=> 56"b" => 12);
?>

Предупреждение

От PHP 4.3.0 насам поведението за генериране на индекси се промени. Сега ако добавяте към масив, в който текущият максимален ключ е отрицателен, следващият създаден ключ ще бъде нула (0). А преди, новият индекс щеше да бъде установен в най-големия съществуващ ключ + 1, както е случая с положителните индекси.

Използването на TRUE като ключ ще се изчисли като целочислено 1. Употребата на FALSE като ключ ще се изчисли като целочислено 0. Използването на NULL като ключ ще се изчисли като празнен низ. Употребата на празен низ като ключ ще създаде (или презапише) ключ с празен низ и съответната му стойност; това не е същото като използването на празни квадратни скоби.

Не можете да използвате масиви или обекти като ключове. Ако се опитате да го направите ще предизвикате предупреждение: Illegal offset type (невалиден тип отместване).

Създаване/променяне с квадратни скоби

Можете също да променяте съществуващ масив чрез изрично установяване на стойностите в него.

Това се осъществява чрез присвояване на стойностите в масива, като ключовете се указват в квадратни скоби. Можете също да пропуснете ключа като добавите празна двойка квадратни скоби ("[]") към името на променливата.

$arr[key] = value;
$arr[] = value;
// key може да бъде цяло число или низ
// value може да бъде каква да е стойност
      
Ако масивът $arr все още не съществува, той ще бъде създаден. Така че това също е и алтернативен начин за указване на масив. За да промените дадена стойност, просто присвоете нова стойност на елемента, указан чрез ключа му. Ако искате да премахнете някоя двойка ключ/стойност, трябва да я унищожите посредством unset().
<?php
$arr 
= array(=> 112 => 2);

$arr[] = 56;    // Това е същото като $arr[13] = 56;
                // в този момент на скрипта

$arr["x"] = 42// Това добавя нов елемент към
                // масива с ключ "x"
                
unset($arr[5]); // Това премахва елемент от масива

unset($arr);    // Това изтрива целия масив
?>

Забележка: Както беше споменато по-горе, ако предоставите квадратните скоби без указан ключ, тогава ще бъде взет максималния съществуващ целочислен индекс и новият ключ ще бъде тази стойност + 1 . Ако все още няма целочислени индекси, ключът ще бъде 0 (нула). Ако укажете ключ, който вече има присвоена стойност, то тази стойност ще бъде презаписана.

Предупреждение

От PHP 4.3.0 насам поведението за генериране на индекси, описано по-горе, се промени. Сега ако добавяте към масив, в който текущият максимален ключ е отрицателен, следващият създаден ключ ще бъде нула (0). А преди, новият индекс щеше да бъде установен в най-големия съществуващ ключ + 1, както е случая с положителните индекси.


Забележете, че максималната целочислена стойност, използвана за целта, не е задължително да същестува в масива в момента. Тя просто трябва да е съществувала някога в масива от последния път, когато масивът е бил повторно индексиран. Следният пример пояснява:
<?php
// Създаване на обикновен масив.
$array = array(12345);
print_r($array);

// Сега изтриваме всеки елемент, но оставяме самия масив непокътнат:
foreach ($array as $i => $value) {
    unset(
$array[$i]);
}
print_r($array);

// Добавяне на елемент (забележете, че новият ключ е 5, а не 0, както
// вероятно бихте очаквали).
$array[] = 6;
print_r($array);

// Повторно индексиране:
$array array_values($array);
$array[] = 7;
print_r($array);
?>

Примерът по-горе ще изведе:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

Полезни функции

Има няколко полезни функции за работа с масиви. Вж. раздел функции за масиви.

Забележка: Функцията unset() позволява унищожаването на ключове от масив, при което масивът НЯМА да бъде повторно индексиран. Ако използвате единствено "обичайните целочислени индекси" (започващи от нула, увеличаващи се с едно), можете да постигнете ефекта на повторно индексиране като използвате array_values().

<?php
$a 
= array(=> 'one'=> 'two'=> 'three');
unset(
$a[2]);
/* ще доведе до масив, който би бил дефиниран като
   $a = array(1 => 'one', 3 => 'three');
   а НЕ като
   $a = array(1 => 'one', 2 =>'three');
*/

$b array_values($a);
// Сега $b е array(0 => 'one', 1 =>'three')
?>

Контролната структура foreach е създадена специално за масиви. Тя предоставя лесен начин за обхождане на масив.

Правилна и неправилна употреба на масиви

Защо $foo[bar] е погрешно?

Винаги трябва да заграждате низовите индекси на масиви с апострофи. Например използвайте $foo['bar'], а не $foo[bar]. Но защо все пак $foo[bar] е неправилно? Може би сте виждали следния синтаксис в по-стари скриптове:

<?php
$foo
[bar] = 'враг';
echo 
$foo[bar];
// etc
?>
Това е погрешно, но работи. Защо тогава все пак е погрешно? Причината е, че този код използва недефинирана константа (bar), а не низ ('bar' - забележете апострофите) и в бъдеще е възможно PHP да дефинира константи, които за нещастие на кода ви, да имат същото име. Това работи, защото PHP автоматично преобразува голия низ (не-апострофиран низ, който не отговаря на нито един известен символ) в низ, съдържащ голия низ. Например ако няма дефинирана константа bar, PHP ще сложи на нейно място низа 'bar' и ще използва него.

Забележка: Това не означава, че трябва винаги да апострофирате ключа. Не трябва да апострофирате ключове, които са константи или променливи, тъй като това ще попречи на PHP да ги интерпретира.

<?php
error_reporting
(E_ALL);
ini_set('display_errors'true);
ini_set('html_errors'false);
// Прост масив:
$array = array(12);
$count count($array);
for (
$i 0$i $count$i++) {
    echo 
"\nПроверка $i: \n";
    echo 
"Неправилно: " $array['$i'] . "\n";
    echo 
"Правилно: " $array[$i] . "\n";
    echo 
"Неправилно: {$array['$i']}\n";
    echo 
"Правилно: {$array[$i]}\n";
}
?>
Примерът по-горе ще изведе:
Проверка 0: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
Неправилно: 
Правилно: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Неправилно: 
Правилно: 1

Проверка 1: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
Неправилно: 
Правилно: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Неправилно: 
Правилно: 2

Още илюстриращи примери:

<?php
// Let's show all errors
error_reporting(E_ALL);

$arr = array('fruit' => 'apple''veggie' => 'carrot');

// Правилно
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// Неправилно. Това работи, но също така хвърля грешка в PHP от ниво
// E_NOTICE, заради недефинирана константа fruit
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // apple

// Нека дефинираме константа, за да демонстрираме какво става. Ще
// присвоим стойност 'veggie' на константа fruit.
define('fruit''veggie');

// Забележете разликата сега
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// Следното е наред, защото е вътре в низ. В низовете не се търсят константи,
// така че няма да има грешка от ниво E_NOTICE.
print "Hello $arr[fruit]";      // Hello apple

// С едно изключение. Фигурните скоби заобикалящи масиви в низове, позволяват
// намирането на константи.
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// Това няма да работи, ще предизвика синтактична грешка подобна на:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Разбира се, това се отнася също и за употребата на свръхглобални в низове.
print "Hello $arr['fruit']";
print 
"Hello $_GET['foo']";

// Същото може да бъде постигнато и чрез съединяване
print "Hello " $arr['fruit']; // Hello apple
?>

В случай, че повишите нивото на error_reporting() до E_NOTICE (например, задавайки го на ниво E_ALL), ще можете да видите тези грешки. По подразбиране нивото на error_reporting е такова, че да не ги показва.

Както беше споменато и в раздел синтаксис, между квадратните скоби ('[' и ']') трябва да има израз. Това означава, че бихте могли да пишете неща подобни на това:

<?php
echo $arr[somefunc($bar)];
?>
Това е пример за използване на стойност, върната от функция, като индекс на масив. PHP също разбира и от константи, както може би сте забелязали в случая с тези от вида E_*.
<?php
$error_descriptions
[E_ERROR]   = "Настъпи фатална грешка";
$error_descriptions[E_WARNING] = "PHP изведе предупреждение";
$error_descriptions[E_NOTICE]  = "Това е просто информиращо съобщение";
?>
Забележете, че E_ERROR също е валиден индентификатор, също както bar в първия пример. Последният пример всъщност е идентичен на следното:
<?php
$error_descriptions
[1] = "Настъпи фатална грешка";
$error_descriptions[2] = "PHP изведе предупреждение";
$error_descriptions[8] = "Това е просто информиращо съобщение";
?>
понеже E_ERROR е равно на 1, и т.н.

Както вече обяснихме по-горе, $foo[bar] работи, но е погрешно. Работи, понеже се очаква bar, заради синтаксиса си, да бъде константен израз. В този случай, обаче, не съществува константа с името bar. Тогава PHP приема, че сте имали предвид литерала bar, като низа "bar", но че сте забравили да напишете кавичките.

Защо е лошо тогава?

В даден момент от бъдещето е възможно екипът на PHP да реши да добави нова константа или ключова дума, или пък вие да решите да добавите константа в собственото си приложение и в този случай се оказвате в беда. Например, вече не можете да използвате думите empty и default по този начин, защото те са специални запазени ключови думи.

Забележка: Да повторим, в рамките на низ, ограден от кавички, е валидно да не заграждате индексите на масивите с апострофи - така "$foo[bar]" е валидно. Вижте горните примери за причините, както и разделът за синтактичен разбор на променливи в низ.

Преобразуване в масив

За всеки от типовете: integer (цяло число), float (плаващ), string (низ), boolean (булев) или resource (ресурс), ако преобразувате стойност в масив ще получите масив с единствен елемент (с индекс 0), който е скаларната стойност, която сте подали.

Ако преобразувате обект в масив ще получите свойствата (член-променливите) на обекта като елементи на масива. Ключовете са имената на член-променливите, с някои изключния: частните (private) променливи ще имат добавено името на класа пред името на променливата; защитените (protected) променливи ще имат добавено "*" пред името на променливата. Тези допълнителни стойности имат null байт от двете страни. Това би могло да доведе до неочаквани резултати.

<?php

class {
    private 
$A// Това ще стане '\0A\0A'
}

class 
extends {
    private 
$A// Това ще стане '\0B\0A'
    
public $AA// Това ще стане 'AA'
}

var_dump((array) new B());
?>
В горния пример ще изглежда, че има два ключа 'AA', въпреки че единият от тях всъщност е '\0A\0A'.

Ако преобразувате стойността NULL в масив ще получите празен масив.

Сравняване

Можете да сравнявате масиви посредством array_diff() или чрез някой от операторите за масиви.

Примери

Типът масив в PHP е много гъвкав, така че ето няколко примера, които да демонстрират пълната мощ на масивите.

<?php
// това
$a = array( 'color' => 'red',
            
'taste' => 'sweet',
            
'shape' => 'round',
            
'name'  => 'apple',
                       
4        // ключът ще бъде 0
          
);

// е абсолютно еквивалентно на
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // ключът ще бъде 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// ще създаде масив array(0 => 'a' , 1 => 'b' , 2 => 'c'),
// или просто array('a', 'b', 'c')
?>

Example #1 Употреба на array()

<?php
// асоциативен масив
$map = array( 'version'    => 4,
              
'OS'         => 'Linux',
              
'lang'       => 'english',
              
'short_tags' => true
            
);
            
// цифрови ключове
$array = array( 7,
                
8,
                
0,
                
156,
                -
10
              
);
// това е същото като array(0 => 7, 1 => 8, ...)

$switching = array(         10// ключ = 0
                    
5    =>  6,
                    
3    =>  7
                    
'a'  =>  4,
                            
11// ключ = 6 (най-големият целочислен индекс беше 5)
                    
'8'  =>  2// ключ = 8 (целочислен!)
                    
'02' => 77// ключ = '02'
                    
0    => 12  // стойността 10 ще бъде заменена от 12
                  
);
                  
// празен масив
$empty = array();         
?>

Example #2 Колекция

<?php
$colors 
= array('red''blue''green''yellow');

foreach (
$colors as $color) {
    echo 
"Do you like $color?\n";
}

?>

Примерът по-горе ще изведе:

Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?

Прякото променяне на стойности в масив е възможно след PHP 5 чрез подаването им по референция. Предишните версии се нуждаят от заобиколно решение:

Example #3 Колекция

<?php
// PHP 5
foreach ($colors as &$color) {
    
$color strtoupper($color);
}
unset(
$color); /* осигуряване, че последващо писане в
$color няма да промени последния елемент на масива */

// заобикаляне за по-стари версии
foreach ($colors as $key => $color) {
    
$colors[$key] = strtoupper($color);
}

print_r($colors);
?>

Примерът по-горе ще изведе:

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

Този пример създава масив, започвайки с ключ едно.

Example #4 Едно-базиран индекс

<?php
$firstquarter  
= array(=> 'January''February''March');
print_r($firstquarter);
?>

Примерът по-горе ще изведе:

Array 
(
    [1] => 'January'
    [2] => 'February'
    [3] => 'March'
)

Example #5 Попълване на масив

<?php
// пълнене на масив с всички неща от дадена директория
$handle opendir('.');
while (
false !== ($file readdir($handle))) {
    
$files[] = $file;
}
closedir($handle); 
?>

Масивите са подредени. Можете също да променяте реда с помощта на някоя подреждаща функции. Вижте раздел функции за масиви за повече информация. Можете да получите броя на елементите в масив с функцията count().

Example #6 Подреждане на масив

<?php
sort
($files);
print_r($files);
?>

Тъй като стойността на масив може да бъде всякаква, то съответно тя може да бъде и друг масив. По този начин можете да правите рекурсивни и многомерни масиви.

Example #7 Рекурсивни и многомерни масиви

<?php
$fruits 
= array ( "fruits"  => array ( "a" => "orange",
                                       
"b" => "banana",
                                       
"c" => "apple"
                                     
),
                  
"numbers" => array ( 1,
                                       
2,
                                       
3,
                                       
4,
                                       
5,
                                       
6
                                     
),
                  
"holes"   => array (      "first",
                                       
=> "second",
                                            
"third"
                                     
)
                );

// някои примери за достъп до масива по-горе
echo $fruits["holes"][5];    // отпечатва "second"
echo $fruits["fruits"]["a"]; // отпечатва "orange"
unset($fruits["holes"][0]);  // премахва "first"

// създаване на нов много-измерен масив
$juices["apple"]["green"] = "good"
?>

Трябва да сте наясно, че присвояването в масиви винаги става с копиране по стойност. Това също означава, че вътрешният масивен указател, използван от current() и подобните й функции, се изчиства. За да копирате масив по референция, трябва да използвате референтния оператор.

<?php
$arr1 
= array(23);
$arr2 $arr1;
$arr2[] = 4// $arr2 е променен,
             // $arr1 е все още array(2, 3)
             
$arr3 = &$arr1;
$arr3[] = 4// сега $arr1 и $arr3 са едно и също
?>



Обекти> <Низове
Last updated: Fri, 27 Jun 2008
 
add a note add a note User Contributed Notes
Масиви
pinkgothic at gmail dot com
13-Sep-2008 05:49
Re: fmouse,

the phenomenom you're describing pertains to superglobals, not arrays, and it only applies in a very specific scope. Check out http://de.php.net/manual/en/language.variables.variable.php :

"Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically."
frywater
05-Jun-2008 01:43
>fmouse

Variable variables can be used with arrays as discussed in the variable variable section.
Also, from your code, $somevar can be an array and still work fine.

$fum = "somevar";
$$fum = array(); // $somevar is now an array
$foo = $$fum;
print_r( $foo); // we get an empty array printed

print_r() doesn't just print arrays, it prints any variable type.
If you pass it a variable, that hasn't been defined yet, it won't know how to print it.

You would get this same results by passing any undefined variable such as:
print_r( $bar );  // PHP Notice: undefined variable ...$bar
fmouse at fmp dot com
29-Apr-2008 10:14
Using variables as array names no longer works in PHP5.

$fum = "somevar";
$foo = $$fum;

# Still works if $somevar isn't an array.  $foo contains the value of $somevar

but ....

$fum = "_POST";
print_r($$fum);
print_r(${$fum});

Neither form of indirection works in this context.  $$fum comes back empty.

If you have PHP4 code that used this kind of indirection you can work around the change in PHP5 using an eval().

$fum = "_POST";
$foo = eval("return $$fum;");
print_r($foo);

This works!
rama dot devi at gmail dot com
18-Mar-2008 10:52
Sorting double dimensional arrays by a specified key bothe for Strings and for integers:
Ex:
 
 $personDetails =  array( array("firstName" => "Nancy", "lastName" => "Grace", "age" => 22), array("firstName" => "Andy",  "lastName" => "Peter", "age" => 28),                           array("firstName" => "Jim",   "lastName" => "Gary",  "age" => 25), array("firstName" => "Lary",  "lastName" => "James", "age" => 28),  array("firstName" => "Peter", "lastName" => "David", "age" => 17), array("firstName" => "Raj",   "lastName" => "King",  "age" => 9),                           array("firstName" => "John",  "lastName" => "Baxter","age" => 35) );
//To sort the array by firstName:-
     function sortFirstName($p1, $p2) {
          return strnatcmp($p1['firstName'], $p2['firstName']);
      }
      usort($personDetails, 'sortFirstName');

//To sort by an integer Field

   function sortByInteger(&$personDetails, $field) {
      $sort = "return strnatcmp(\$p1['$field'], \$p2['$field']);";
       usort($personDetails, create_function('$p1,$p2', $sort));
        return $personDetails;
    }

    $personDetails = sortByInteger($personDetails, 'age');
//To sort the array in Descending order by a key, It can be done by adding "-" sign before strnatcmp() function.

I hope this helps
ken underscore yap atsign email dot com
09-Jan-2008 05:00
"If you convert a NULL value to an array, you get an empty array."

This turns out to be a useful property. Say you have a search function that returns an array of values on success or NULL if nothing found.

$values = search(...);

Now you want to merge the array with another array. What do we do if $values is NULL? No problem:

$combined = array_merge((array)$values, $other);

Voila.
pepesantillan at gmail dot com
19-Dec-2007 01:25
z on 22-Apr-2005 12:10 wrote:
-----------------------------------------------
Here's a simple function to insert a value into some position in an array

<?php
function array_insert($array,$pos,$val)
{
   
$array2 = array_splice($array,$pos);
   
$array[] = $val;
   
$array = array_merge($array,$array2);
  
    return
$array;
}
?>

and now for example...
<?php
$a
= array("John","Paul","Peter");
$a = array_insert($a,1,"Mike");
?>

Now $a will be "John","Mike","Paul","Peter"
-----------------------------------------------

Im learning to use PHP and reading about array_splice found that

<?php
function array_insert($array,$pos,$val)
{
   
$array2 = array_splice($array,$pos);
   
$array[] = $val;
   
$array = array_merge($array,$array2);

    return
$array;
}

$a = array("John","Paul","Peter");
$a = array_insert($a,1,"Mike");
print_r($a);
?>

would output the same as

<?php
$b
= array("John","Paul","Peter");
array_splice($b,1,0,array("Mike"));
print_r($b);
?>
SID TRIVEDI
10-Oct-2007 11:14
<?php

//Simple Login Script using associative array.

//You may modify the codes and use $_POST['FORM_FIELD_DATA'] for your web-page.
//You may spice-up the codes with more form field validation & security features.

//$user_name=$_POST['user_name'];
//$password=$_POST['password'];

$test_user_name = 'michelle_smith'; //for testing purpose only
$test_password = 'msmith321';        //for testing purpose only
$user_name = $test_user_name;
$password = $test_password;

// here user_name is key and password is the value of an array..
// website owner has to add new user/site member manually in $login_array

$login_array = array(
               
'user_name' => 'password',
               
'alex_duff' => 'alx321',
                   
'xena78' => 'xena321',
               
'dela_pena' => 'delp321',
               
'shawn_1981' => 'shw81',
               
'michelle_smith' => 'msmith321');

ksort ($login_array);
reset($login_array);
if (isset(
$login_array[$user_name]))
{
$pass_check = $login_array[$user_name];
if (
$password === $pass_check)
{
echo 
"Welcome, $user_name!\n<br>"; //may redirect to specific webpage.
}
else
{
echo
"Please try again!"; //may redirect to Error page.
}
}
else
{
    echo
"Please register with us. Thanks!"; //may redirect to registration page.
   
exit();
   
}
echo(
"\n<br>");
echo
'Thanks to Thies C. Arntzen, Stig Bakken, Shane Caraveo, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski for wonderful PHP!';

?>
carl at linkleaf dot com
06-Sep-2007 08:36
Its worth noting that there does not appear to be any functional limitations on the length or content of string indexes. The string indexes for your arrays can contain any characters, including new line characters, and can be of any length:

<?php

$key
= "XXXXX";
$test = array($key => "test5");

for (
$x = 0; $x < 500; $x++) {
 
$key .= "X";
 
$value = "test" . strlen($key);
 
$test[$key] = $value;
}

echo
"<pre>";
print_r($test);
echo
"</pre>";

?>

Keep in mind that using extremely long array indexes is not a good practice and could cost you lots of extra CPU time. However, if you have to use a long string as an array index you won't have to worry about the length or content.
Gautam
30-Aug-2007 10:56
<?php
//EXAMPLE  of Multi-Dimentional Array where as an array's keys are an array itself.
//It's so easy to create one like this.

$movie_to_watch = array ('Action'=>
          array(
'Kanu Reeves' => 'Matrix Reloaded',
                     
'Pearce Brosnan' => 'Die Another Day',
                     
'Tom Cruz' => 'Mission Impossible',
                     
'Jason Statham' => 'Crank',
                     
'Danzel Washington' => 'Man on Fire'),
               
'Comedy' =>
                array (
'Charlie Chaplin' => 'City Lights',
                      
'Jim Carrey'    => 'Cable Guy',
                      
'Rowan Atkinson' => 'The Ultimate Disaster'));
$type_wanted = 'Action'; //You may switch type from Action to Comedy.
$hero_wanted = 'Pearce Brosnan'; // You may switch hero from Pearce Brosnan to Jim Carrey.

print ("$hero_wanted 's  $type_wanted movie is " . $movie_to_watch[$type_wanted][$hero_wanted].".");
// produces browser output as under:
// Pearce Brosnan 's Action movie is Die Another Day.
?>
Olegk, getmequick[at]gmail[dot]com
21-Aug-2007 11:59
Hey..

here is a function which helps to avoid using empty/isset
checkings for arrays.

(it's acts simillar to 'default' modifier in Smarty)

Using this function you will avoid 'Undefined index' or
'Undefined offset' error.

<?php

$_POST
['id']['other'] = 'val1';

/*
key exist (same as $_POST['id'][other])
*/
echo getRequestParam('id[other]', 'default value');

/*
key doesn't exist, we get default value (same as $_POST['var'])
*/

echo getRequestParam('var', 'default value');

function
getRequestParam( $var, $default = '', $method = 'post' )
{
   
preg_match_all('!(\w+)!i',$var, $match );
   
array_shift($match);
   
$_vars = $match[0];
   
$ret = null;   
   
    if(    
strtoupper($method)   ==  'POST' ) {
       
$ret = _findRequestParam($_vars, $_POST);
    }
    elseif(
strtoupper($method) == 'GET' ) {
       
$ret = _findRequestParam($_vars, $_GET);
    }
    elseif(
strtoupper($method) == 'COOKIE' ) {
       
$ret = _findRequestParam($_vars, $_COOKIE);
   
    }
    elseif(
strtoupper($method) == 'SESSION' ) {
       
$ret = _findRequestParam($_vars, $_SESSION);
    }   
   
    if (!
$ret )
          return
$default;
    else
        return
$ret;       
   
}

/**
@access private
*/

function _findRequestParam($vars, $find_in , $curr_key = 0)
{
    static
$ret;
   
    if(
array_key_exists($vars[$curr_key], $find_in) ) {
        if(
count( $vars)-1 == $curr_key ) {
           
$ret $find_in[$vars[$curr_key]];
        }
        elseif(
$curr_key < count( $vars)-1 ) {
           
_findRequestParam( $vars, $find_in[$vars[$curr_key]], $curr_key+);       
        }   
    }

    return
$ret;

}

?>

Hope this will help someone!
conorj
14-Jul-2007 05:34
Another note on unquoted array indices. Because it is first interpreted as a constant, it must obey the naming convention of constants. i.e. a letter or underscore followed by optional letter, digit and/or underscore characters.

Therefore while the following array declaration is legal:
$a = array('1st'=>'First','2nd'=>'Second');

Trying to access either array item as follows causes an error:

$first = "$a[1st]";
$second = "$a[2nd]";
moehbass at gmail dot com
11-Jul-2007 02:41
<b>Mark Gukov</b> wrote below:

Regarding the fact that there's no need to quote arrays keys when enclosed in double quotes: it only applies to single dimensional arrays.

The following works fine:

<?php
$r
['a'] = 'apple';
echo
"$r[a] is tasty.";
?>

...but in the case of multi-dimensional arrays:

<?php
$r
['a']['b'] = 'banana';
echo
"$r[a][b] is tasty.";
?>

would result in "Array[c] is tasty."
-----------------------------------------------------------------

However, the following runs fine;
$r['a']['b'] = 'banana';
echo "{$r[a][b]} is tasty.";

Just box it!
don dot hosek at gmail dot com
24-May-2007 02:37
It's slightly faster to use array_splice to remove an element of an array:
array_splice($array, $index, 1)
than to do it using the suggested method of unset and reindex:
unset($array[$index]);
$array = array_values($array);

The difference, however, is very small. With 950 iterations I had times of
unset and reindex: 0.22837495803833
splice: 0.22392416000366
lesantoso at yahoo dot com
20-Mar-2007 11:14
This Indonesian number speller function is twice
faster(*) than the one provided in class Terbilang by
anghuda(at)gmail(dot)com (25-May-2006 08:52):

http://www.lesantoso.com/terbilang.html

(*) 2.1 vs. 4.2 seconds in processing 10000 random numbers
Spudley
16-Mar-2007 10:44
On array recursion...

Given the following code:

<?
$myarray
= array('test',123);
$myarray[] = &$myarray;
print_r($myarray);
?>

The print_r() will display *RECURSION* when it gets to the third element of the array.

There doesn't appear to be any other way to scan an array for recursive references, so if you need to check for them, you'll have to use print_r() with its second parameter to capture the output and look for the word *RECURSION*.

It's not an elegant solution, but it's the only one I've found, so I hope it helps someone.
kal at kalunite dot com i mean dot net
17-Jan-2007 02:55
About the automatic conversion of bare strings...
My opinion is that it never should have been implemented. Isn't it easier to NOT implement this "handy" feature in the first place? It is such a convenient way for "smart" programmers to write unsafe, not-futureproof code. Please remove this feature from future versions of PHP, please. (Hey, if you could change the OOP mechanisms between PHP 4 and PHP 5, why can't you make this change, right?)
25-Oct-2006 06:18
This page should include details about how associative arrays are implemened inside PHP; e.g. using hash-maps or b-trees.

This has important implictions on the permance characteristics of associative arrays and how they should be used; e.g. b-tree are slow to insert but handle collisions better than hashmaps.  Hashmaps are faster if there are no collisions, but are slower to retrieve when there are collisions.  These factors have implictions on how associative arrays should be used.
Mark Gukov
27-Sep-2006 11:18
Regarding the fact that there's no need to quote arrays keys when enclosed in double quotes: it only applies to single dimensional arrays.

The following works fine:

<?php
$r
['a'] = 'apple';
echo
"$r[a] is tasty.";
?>

...but in the case of multi-dimensional arrays:

<?php
$r
['a']['b'] = 'banana';
echo
"$r[a][b] is tasty.";
?>

would result in "Array[c] is tasty."
petruzanautico at yahoo dot com dot ar
21-Sep-2006 05:30
Regarding the message of phoenixbytes:

The line foreach($bad as $baddies); will just yield in $baddies the last value of the array $bad.
I think that wasn't your intention, in that case there are faster and better ways than foreach.

I think what you wanted to do is:
<?php
foreach($bad as $baddies) // make a collection
{
    if (
preg_match("/$baddies/i", $mailto)) // find a match
   
{
   
$addrmail = "false";
    }
    else
    {
   
$addrmail = "true";
    }
}
// foreach end
?>
php dot net at todandlorna dot com
26-Jul-2006 01:28
in response to ch dot martin at gmail dot com

If you are using the following code:

<?php
$r
= array('05' => "abc", '35' => "def");
foreach (
$r as $key=>$value)
  
var_dump($key);
?>

and you need the array key '35' to be a string (for looping maybe), you can make sure the key is a string by appending a 0 on the front.

'035' instead of '35'
ch dot martin at gmail dot com
09-Jun-2006 08:40
Extremely irritating quirk regarding the variable types of array keys:

<?php
$r
= array('05' => "abc", '35' => "def");
foreach (
$r as $key=>$value)
   
var_dump($key);
?>

The first var_dump for '05' is:
    string(2) "05"
as expected.  But the second, '35', turns out as:
    int(35)

Php apparently decided to make the 35 became an int, but not the 05 (presumably because it leads with a zero).  As far as I can see, there is absolutely no way of making string(2) "35" an array key.
anghuda(at)gmail(dot)com
25-May-2006 03:52
this is simpler tha function display_angka_bilangan by ktaufik(at)gmail(dot)com (16-Feb-2005 12:40)

<?

/*
*
* Class : Terbilang
* Spell quantity numbers in Indonesian or Malay Language
*
*
* author: huda m elmatsani
* 21 September 2004
* freeware
*
* example:
* $bilangan = new Terbilang;
* echo $bilangan -> eja(137);
* result: seratus tiga puluh tujuh
*
*
*/

Class Terbilang {

    function
terbilang() {
       
$this->dasar = array(1=>'satu','dua','tiga','empat','lima','enam',
       
'tujuh','delapan','sembilan');

       
$this->angka = array(1000000000,1000000,1000,100,10,1);
       
$this->satuan = array('milyar','juta','ribu','ratus','puluh','');
    }

    function
eja($n) {

   
$i=0;
    while(
$n!=0){

       
$count = (int)($n/$this->angka[$i]);

        if(
$count>=10