Многомерни масиви и запазване на масиви

Едно ключово предимство на масивите е, че те могат да съдържат други масиви. В момента нашите масиви просто съдържат стандартни променливи, които не са масиви, което ги прави едномерни. Чрез превключване към двумерен масив – всеки елемент държи масив като своя стойност, а всеки елемент в дъщерния масив съдържа променлива, която не е масив – можем да съхраняваме много повече информация. Помислете за този скрипт:

<?php
    $capitalcities['England'] = array("Capital"=>"London", "Population"=>40000000, "NationalSport"=>"Cricket");
    $capitalcities['Wales'] = array("Capital"=>"Cardiff", "Population"=>5000000, "NationalSport"=>"Rugby");
    $capitalcities['Scotland'] = array("Capital"=>"Edinburgh", "Population"=>8000000, "NationalSport"=>"Football");
    var_dump($capitalcities);
?>

Този път създаваме нашите масиви от $capitalcities като преди, но използваме масив за всяка стойност. Всеки дъщерен масив има три елемента: Capital, Population и NationalSport. В края има var_dump() за родителския масив, който наистина трябва да ви покаже колко полезен е var_dump(). Ето резултата:

array(3) {
    ["England"]=>
    array(3) {
        ["Capital"]=>
        string(6) "London"
        ["Population"]=>
        int(40000000)
        ["NationalSport"]=>
        string(7) "Cricket"
    }
    ["Wales"]=>
    array(3) {
        ["Capital"]=>
        string(7) "Cardiff"
        ["Population"]=>
        int(5000000)
        ["NationalSport"]=>
        string(5) "Rugby"
    }
    ["Scotland"]=>
    array(3) {
        ["Capital"]=>
        string(9) "Edinburgh"
        ["Population"]=>
        int(8000000)
        ["NationalSport"]=>
        string(8) "Football"
    }
}

Както можете да видите, var_dump () не само се връща в дъщерни масиви, за да изведе съдържанието им, но отстъпва всички изходи според нивото на масива.

Помислете за многомерните масиви, като ви позволяват да съхранявате масиви от масиви, защото това е най-често срещаната им цел. Разбира се, те също могат да съхраняват масиви от масиви от масиви и така нататък, но всичко е същото.

Забележка: Функцията count() има полезен втори параметър, който, когато е зададен на 1, кара count () да извършва рекурсивно броене. Разликата е, че ако преминете в многомерен масив, count () ще преброи всички елементи в първия масив, след това ще влезе в първия елемент на масива и ще преброи всички елементи там, и ще влезе във всички елементи там и т.н., и т.н. Например, масивът $capitalcities по-горе има три елемента, така че ако не използвате втория параметър за count (), ще получите 3 обратно. Ако обаче въведете 1 за втория параметър, ще получите 12: три за елементите от първо ниво („Англия“, „Уелс“, „Шотландия“) и три за променливите вътре в тези елементи („Капитал“ „,“ Население „,“ NationalSport „).

Запазване на масиви

string serialize ( mixed value)
mixed unserialize ( string input)
string urlencode ( string text)
string urldecode ( string encoded)

Тъй като масивите са сложни типове данни, не можете да видите съдържанието им директно. Ако се опитате да отпечатате стойността на масив, ще видите, че PHP извежда просто „Array“, което означава, че предаването на стойността на масив през връзка изисква много работа. За щастие, PHP идва на помощ с четири функции, които вършат цялата упорита работа вместо вас: serialize(), unserialize(), urlencode() и urldecode().

Serialize () преобразува масив, даден като единствен параметър, в нормален низ, който можете да запишете във файл, да предадете URL и т.н. Unserialize() е обратното на serialize() – отнема сериализиране () d низ и го преобразува обратно в масив.

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

Предаването на масиви през страници е най-добре да се използва urlencode() и urldecode(), но трябва да помислите да ги използвате и за всички данни, които предавате в мрежата, само за да сте сигурни, че там няма несъвместими символи.

Разгледайте този код:

<?php
    $array["a"] = "Foo";
    $array["b"] = "Bar";
    $array["c"] = "Baz";
    $array["d"] = "Wom";

    $str = serialize($array);
    $strenc = urlencode($str);
    print $str . "\n";
    print $strenc . "\n";
?>

Това ще изведе два реда (вторият от които съм принуден да увия, така че да изглежда правилно!):

 a:4:{s:1:"a";s:3:"Foo";s:1:"b";s:3:"Bar";s:1:"c";s:3:"Baz";s:1:"d";s:3:"Wom";}
a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A3%3A%22Foo%22%3Bs%3A1%3A%22b%22%3Bs%3A0%3A%22 %22%3Bs%3A1%3A%22c%22%3Bs%3A3%3A%22Baz%22%3Bs%3A1%3A%22d%22%3Bs%3A3%3A%22Wom%22%3B%7D 

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

<?php
    $arr = unserialize(urldecode($strenc));
    var_dump($arr);
?>

Авторско: Ако искате да прехвърлите двоични данни през мрежата, трябва да използвате rawurlencode () и rawurldecode (), за разлика от urlencode () и urldecode (), тъй като необработените версии са бинарни.

Източник: www.hackingwithphp.com

Вашият коментар