Работа с променливи (Част 3)

Работа с масиви


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

Масивът се създава по следния начин:

<?php
$array = array();
?>
където
    array(
    ключ1 => стойност1,
    ключ2 => стойност2,
    ключ3 => стойност3,
    ...
)

Запетаята в последния ред не е задължителна и може да се изпусне. Ключът може да е цяло число или низ, а стойността може да е всеки вид променлива. Операторът „=>” се прилага за назначаване на стойност към ключа.

Да вземем за пример създаването на списък с химични елементи. Тогава масивът, който ще съдържа наименованията на тези химични елементи, може да се запише така:

<?php
$elements = array(
                  "Водород", 
                  "Кислород", 
                  "Хелий", 
                  "Натрий", 
                  "Радон", 
                  "Радий"
                 );
?>

Ако изрично не са посочени ключовете на отделните елементи на масива, номерирането им започва от 0. Ако искаме да изведем стойността, например на петия елемент от масива, пишем:
<?php
$elements = array(
                  "Водород", 
                  "Кислород", 
                  "Хелий", 
                  "Натрий", 
                  "Радон", 
                  "Радий"
                 );
var_dump ($elements); //Извежда елементите на масива
echo "<br/><br/>";
//Извежда елемент  с ключ 4 от масива (петият елемент в масива)
echo "Петият елемент в списъка е" . " " . $elements [4] . ".";
?>

Функцията, даваща информация за типа на променливата $elements, нейното наименование и ключ, е var_dump (). При изпълнение на скрипта, записан по-горе, в прозореца на браузъра ще видите:

array-1-JPG

Резултатът, показан на изображението може да се разпише така:
array(6) { 
          [0]=> string(14) "Водород" 
          [1]=> string(16) "Кислород" 
          [2]=> string(10) "Хелий" 
          [3]=> string(12) "Натрий" 
          [4]=> string(10) "Радон" 
          [5]=> string(10) "Радий" 
         }

Информацията, която получаваме: масивът е съставен от 6 елемента, всички са стрингове, виждат се и двойките ключ => стойност.

Ако искаме да изготвим списък с имена на хора и тяхната професия, тогава:

<?php
$name_and_profession= array (
                             "Edelw" => "teacher ", 
                             "Maya" => "doctor", 
                             "Ivan" => "engineer"
                            );
echo "Edelw is a" . " " . $name_and_profession ["Edelw"] . "." . "<br/>";
echo "Maya is a" . " " . $name_and_profession ["Maya"] . ".". "<br/>";
echo "Ivan is an" . " " . $name_and_profession ["Ivan"] . ".". "<br/>";
?>

array-2-JPG

Примерите, които дадох по-горе, са примери за едномерни масиви. В практиката често се налага създаване на многомерни масиви. Многомерните масиви са съставени от два или повече мономерни масива.

Да се върнем отново на примера с химичните елементи. От часовете по химия ни е известно, че химичните елементи се делят на елементи с метален химичен характер, елементи с неметален химичен характер и елементи с двойствен химичен характер. Да съставим масив $elements, който ще съдържа в себе си три масива: $elements (Метали); $elements (Неметали) и $elements (Двойнствен характер).

$elements = array();
$elements ["Метали"] = array("Натрий", "Литий");
$elements ["Неметали"] = array("Хлор", "Бром");
$elements ["Двойнствен характер"] = array("Алуминий", "Цинк");

За да изведем на екрана всеки масив от $elements с неговите членове, пишем следния скрипт:
<?php
$elements = array();

$elements["Метали"] = array("Натрий", "Литий");
$elements["Неметали"] = array("Хлор", "Бром");
$elements["Двойствен характер"] = array("Алуминий", "Цинк");

foreach($elements as $categoryName => $value)
{
    echo "<b>" . $categoryName . ":</b><br />";
    foreach($elements[$categoryName] as $name)
    {
        echo $name . "<br />";
    }
    echo "<br />";
}
?>

В браузъра ще видим:
array-3-JPG

Първо създаваме празен масив, наречен $elements. В него искаме да съхраним имена на химични елементи с различни химични свойства. Първият масив ще съдържа различните групи елементи според свойствата (метали, неметали и двойствен химичен характер), всяка от която ще сочи към конкретни представители химични елементи, принадлежащи на тази група.

Функцията foreach() служи за обхождане на масиви. При първия цикъл обхожда зададения чрез $categoryName масив. При всяка итерация стойността на текущия елемент се присвоява на променливата $value и вътрешния указател на масива се придвижва с единица и при следващата итерация се разглежда следващия елемент. Вторият цикъл прави същото нещо, но ключът на текущия елемент ще бъде присвоен на променливата $name при всяка итерация.

Други полезни функции при работа с масиви са функциите implode() и explode(). С implode() можем да изведем елементите на масива в низ. Например:

<?php
$alkali= array("Литий", "Натрий", "Калий", "Рубидий", "Цезий");
$comma_separated = implode(",", $alkali);
echo "Алкални елементи са:" ." ". $comma_separated . "."; 
?>

array-4-JPG

В синтаксиса си функцията explode() съдържа три параметъра:

array explode ( string $delimiter , string $string [, int $limit = -1 ] )

Ако не е зададена стойност на параметъра $limit, функцията връща масив, съдържащ всички елементи на низа. Например:
<?php
$array= "Литий, Натрий, Калий, Рубидий, Цезий";
$alkali = explode (",", $array);
print_r ($alkali); 
?>

array-5-JPG

Как можем да проверим дали една стойност съществува в масива или не? Това можем да направим с помощта на функцията in_array(). Например:

<?php
$alkali = array("Литий", "Натрий", "Калий", "Рубидий", "Цезий");

if(in_array("Калий", $alkali))
    echo "Елементът Калий е включен в масива.";
else
    echo " Елементът Калий не е включен в масива.";
?>

array-6-JPG

Синтаксисът на функцията in_array() e:

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

Функцията in_array() може да приема три параметъра, като третият е незадължителен (той определя дали сравнението ще е стриктно, което означава дали стойността и нейният тип съвпадат). Подразбиращата се стойност на третия параметър е FALSE.

Ако е необходимо да се провери дали в даден масив съществува определен ключ, се прилага функцията array_key_exists().

Понякога получавате масив от външен източник- база данни или файл, например. В тези случаи може да възникне дублиране на стойностите. За да се премахнат подобни дублирания, можем да прилагаме функцията array_unique(). Тази функция ще върне масив, в който всички стойности са уникални. Например:

<?php
$alkali = array("Литий", "Натрий", "Калий", "Рубидий", "Цезий", "Натрий");

echo "Елементите в масива са:<br />";
foreach($alkali as $value)
    echo $value . "<br />";

echo "<br />";

$array = array_unique($alkali);

echo "Елементите в масива с уникални стойности са:<br />";
foreach($alkali as $value)
    echo $value . "<br />";
?>

array-7-JPG

Когато се нуждаем да изведем произволно един или няколко члена от масива, прилагаме функцията array_rand().

<?php
$day = array(
             "Понеделник", 
             "Вторник", 
             "Сряда", 
             "Четвъртък", 
             "Петък", 
             "Събота",
             "Неделя");
$rand_keys = array_rand($day, 2);
echo "Произволно избраните дни от седмицата са:" 
." ". $day[$rand_keys[0]] ." "."и" . "\n";
echo $day[$rand_keys[1]] . "\n";
?>

array-8-JPG

Как се осъществява сортирането на масиви? Това се постига с помощта на функцията sort():

<?php
$day = array(
             "Понеделник", 
             "Вторник", 
             "Сряда", 
             "Четвъртък", 
             "Петък", 
             "Събота", 
             "Неделя");
echo "Неподреден списък с дните от седмицата: " 
. " ". implode(", ", $day);
echo "<br /><br />";

sort($day);
echo "Дните от седмицата в азбучен ред: "
. " " . implode(", ", $day);
echo "<br /><br />";

$day = array_reverse($day);
echo "Дните от седмицата, подредени в обратен на азбучния ред: "
. " " . implode(", ", $day);
?>

array-9-JPG

Може примерът за сортиране на дните от седмицата да ви се стори глупав и неприложим в практиката. :) Аз не мисля така, и считам, че не се налага да обяснявам защо. :)

Стандарт JSON и масиви


JSON, или JavaScript Object Notation, е текстово базиран отворен стандарт създаден за човешки четим обмен на данни. Произлиза от скриптовия език JavaScript, за да представя прости структури от данни и асоциативни масиви, наречени обекти. Въпреки своята връзка с JavaScript, това е езиково независима спецификация, с анализатори, които могат да преобразуват много други езици в JSON. Форматът на JSON първоначално е бил създаден от Дъглас Крокфорд (Douglas Crockford) и е описан в RFC 4627. Официалният Интернет медия тип за JSON е application/json. Разширението на файловете написани на JSON е .json. Форматът на JSON често е използван за сериализация и предаване на структурирани данни през Интернет връзка. Използва се главно, за да предаде данни между сървър и Интернет приложение, изпълнявайки функциите на алтернатива на XML.

<?php
//json_app.php

//Задава кодирането на страницата
header('Content-Type: text/html; charset=UTF-8');

//Създава масив от 6 елемента
$elements = array(  
"Водород",   
"Кислород",   
"Хелий",   
"Натрий",   
"Радон",   
"Радий"
  );

//Извежда елементите на масива 
var_dump ($elements);
echo "<br/><br/>";
foreach($elements as $num => $value)
echo '<br/>'. $num.' : '. $value;
echo "<br/><br/>";
  
//Извежда елемент  с ключ 4 от масива (петият елемент в масива)
echo "Петият елемент в списъка е" . " " . $elements [4] . "." . "<br><br>"; 

//Кодира масива в JSON стринг
$json_1= json_encode($elements); 

//Извежда на екрана JSON стринга, който ще се декодира
echo "JSON стринга има следния вид:" . "<br>" . $json_1 . "<br><br>";

//Декодира JSON стринга
$json_2 =json_decode($json_1,true);
 
//Извежда съдържанието на масива
foreach($json_2 as $num => $value)
echo '<br/>'. $num.' : '. $value;
   
?>  
test-tube-png
json-app-png
JSON кодиране и декодиране на масив

sign.png

Няма коментари:

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