Перейти к содержимому

Как добавить элемент в ассоциативный массив php

  • автор:

array_unshift

array_unshift() добавляет переданные в качестве аргументов элементы в начало массива array . Обратите внимание, что список элементов добавляется целиком, то есть порядок элементов сохраняется. Все числовые ключи будут изменены таким образом, что нумерация массива будет начинаться с нуля, в то время как строковые ключи останутся прежними.

Замечание:

Сбрасывает внутренний указатель массива на первый элемент.

Список параметров

Значения для добавления.

Возвращаемые значения

Возвращает новое количество элементов в array .

Список изменений

Версия Описание
7.3.0 Теперь эта функция может быть вызвана с одним параметром. Ранее требовалось минимум два параметра.

Примеры

Пример #1 Пример использования array_unshift()

array_unshift ( $queue , «apple» , «raspberry» );
var_dump ( $queue );
?>

Результат выполнения данного примера:

array(4) < [0] =>string(5) "apple" [1] => string(9) "raspberry" [2] => string(6) "orange" [3] => string(6) "banana" >

Пример #2 Пример использования с ассоциативными массивами

Если один ассоциативный массив добавляется к другому ассоциативному массиву, то добавляемый массив продолжает числовой индекс первого массиве.

$foods = [
‘apples’ => [
‘McIntosh’ => ‘red’ ,
‘Granny Smith’ => ‘green’ ,
],
‘oranges’ => [
‘Navel’ => ‘orange’ ,
‘Valencia’ => ‘orange’ ,
],
];
$vegetables = [
‘lettuce’ => [
‘Iceberg’ => ‘green’ ,
‘Butterhead’ => ‘green’ ,
],
‘carrots’ => [
‘Deep Purple Hybrid’ => ‘purple’ ,
‘Imperator’ => ‘orange’ ,
],
‘cucumber’ => [
‘Kirby’ => ‘green’ ,
‘Gherkin’ => ‘green’ ,
],
];

array_unshift ( $foods , $vegetables );
var_dump ( $foods );

Результат выполнения данного примера:

array(3) < [0] =>array(3) < 'lettuce' =>array(2) < 'Iceberg' =>string(5) "green" 'Butterhead' => string(5) "green" > 'carrots' => array(2) < 'Deep Purple Hybrid' =>string(6) "purple" 'Imperator' => string(6) "orange" > 'cucumber' => array(2) < 'Kirby' =>string(5) "green" 'Gherkin' => string(5) "green" > > 'apples' => array(2) < 'McIntosh' =>string(3) "red" 'Granny Smith' => string(5) "green" > 'oranges' => array(2) < 'Navel' =>string(6) "orange" 'Valencia' => string(6) "orange" > >

Смотрите также

  • array_shift() — Извлекает первый элемент массива
  • array_push() — Добавляет один или несколько элементов в конец массива
  • array_pop() — Извлекает последний элемент массива

User Contributed Notes 12 notes

16 years ago

You can preserve keys and unshift an array with numerical indexes in a really simple way if you’ll do the following:

$someArray =array( 224 => ‘someword1’ , 228 => ‘someword2’ , 102 => ‘someword3’ , 544 => ‘someword3’ , 95 => ‘someword4’ );

$someArray =array( 100 => ‘Test Element 1 ‘ , 255 => ‘Test Element 2’ )+ $someArray ;
?>

now the array looks as follows:

array(
100=>’Test Element 1 ‘,
255=>’Test Element 2′
224=>’someword1′,
228=>’someword2′,
102=>’someword3′,
544=>’someword3′,
95=>’someword4′
);

21 years ago

array_merge() will also reindex (see array_merge() manual entry), but the ‘+’ operator won’t, so.

$arrayone =array( «newkey» => «newvalue» ) + $arrayone ;
?>

does the job.

11 years ago

Sahn’s example almost works but has a small error. Try it like this if you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:

8 years ago

Anonymous’ associative version wasn’t working for me, but it did with this small tweak:

7 years ago

Another way to tack something to the beginning of an array is with array_merge().

$plans = array(‘AARP’=>’Senior’, ‘AAA’=>’Automobile Club’);

$plans = array_merge(array(«BAR»=>»Best Available Rate»), $plans);

16 years ago

This becomes a nice little problem if you index your arrays out of order (while manually sorting). For example:

$recordMonths [ 3 ] = ‘8/%/2006’ ;
$recordMonths [ 4 ] = ‘7/%/2004’ ;
$recordMonths [ 0 ] = ‘3/%/2007’ ;
$recordMonths [ 1 ] = ‘2/%/2007’ ;
$recordMonths [ 5 ] = ’12/%/2000′ ;
$recordMonths [ 6 ] = ’11/%/2000′ ;
$recordMonths [ 7 ] = ’10/%/2000′ ;
$recordMonths [ 2 ] = ‘1/%/2007’ ;

for( $i = 0 ; $i < count ( $recordMonths ); $i ++)
<
$singleMonth = $recordMonths [ $i ];
echo «singleMonth: $singleMonth
» ;
>
array_unshift ( $recordMonths , ‘%’ );
for( $i = 0 ; $i < count ( $recordMonths ); $i ++)
<
$singleMonth = $recordMonths [ $i ];
echo «singleMonth: $singleMonth
» ;
>
?>

Produces:

singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 1/%/2007
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: %
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: 1/%/2007

It reindexes them based on the order they were created. It seems like if an array has all numeric indexes, then it should reindex them based on the order of their index. Just my opinion.

19 years ago

even simpler unshifting of a reference !
/**
* @return int
* @param $array array
* @param $value mixed
* @desc Prepend a reference to an element to the beginning of an array. Renumbers numeric keys, so $value is always inserted to $array[0]
*/
function array_unshift_ref (& $array , & $value )
$return = array_unshift ( $array , » );
$array [ 0 ] =& $value ;
return $return ;
>
?>

21 years ago

Actually this problem with the keys getting reindexed only happens when the keys are numerical:

$a = array( «f» => «five» , «s» => «six» , «t» =>
«twenty» );

print_r ( $a );
echo «\n» ;
foreach( $a as $key => $val )
echo «k: $key v: $val \n» ;
>

array_unshift ( $a , «zero» );
print_r ( $a );
echo «\n» ;
foreach( $a as $key => $val )
echo «k: $key v: $val \n» ;
>
?>

Array
(
[f] => five
[s] => six
[t] => twenty
)

k: f v: five
k: s v: six
k: t v: twenty
Array
(
[0] => zero
[f] => five
[s] => six
[t] => twenty
)

k: 0 v: zero
k: f v: five
k: s v: six
k: t v: twenty

22 years ago

If you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:

20 years ago

If you need to change the name of a key without changing its position in the array this function may be useful.

function array_key_change ( $Old , $New , $In , $NewVal = NULL ) <
$Temp = array();
while(isset( $Temp [ $Old ]) == false ) <
list( $k , $v ) = each ( $In );
$Temp [ $k ] = $v ;
unset( $In [ $k ]);
>
if( $NewVal == NULL ) <
$NewVal = $Temp [ $Old ];
>
unset( $Temp [ $Old ]);
$Temp = array_reverse ( $Temp );
$In = array_merge (array( $New => $NewVal ), $In );
while(list( $k , $v ) = each ( $Temp )) <
$In = array_merge (array( $k => $v ), $In );
>
return( $In );
>
?>

17 years ago

I had a need tonight to convert a numeric array from 1-based to 0-based, and found that the following worked just fine due to the «side effect» of renumbering:

array_unshift ( $myArray , array_shift ( $myArray ));
?>

19 years ago

Last version of PHP deprecated unshifting of a reference.
You can use this function instead :

function array_unshift1 (& $ioArray , $iValueWrappedInAnArray ) <
$lNewArray = false ;
foreach ( array_keys ( $ioArray ) as $lKey )
$lNewArray [ $lKey + 1 ] = & $ioArray [ $lKey ];
$ioArray = array (& $iValueWrappedInAnArray [ 0 ]);
if ( $lNewArray )
foreach ( array_keys ( $lNewArray ) as $lKey )
$ioArray [] = & $lNewArray [ $lKey ];
return count ( $ioArray );
>

// before last PHP (now generates a deprecation warning)
array_unshift ( $a , & $v );
// since last PHP (caution, there is a wrapping array !!)
array_unshift1 ( $a , array (& $v ));
?>

  • Функции для работы с массивами
    • array_​change_​key_​case
    • array_​chunk
    • array_​column
    • 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_​is_​list
    • array_​key_​exists
    • array_​key_​first
    • array_​key_​last
    • array_​keys
    • array_​map
    • array_​merge_​recursive
    • array_​merge
    • array_​multisort
    • array_​pad
    • array_​pop
    • array_​product
    • array_​push
    • array_​rand
    • array_​reduce
    • array_​replace_​recursive
    • array_​replace
    • 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
    • end
    • extract
    • in_​array
    • key_​exists
    • key
    • krsort
    • ksort
    • list
    • natcasesort
    • natsort
    • next
    • pos
    • prev
    • range
    • reset
    • rsort
    • shuffle
    • sizeof
    • sort
    • uasort
    • uksort
    • usort
    • each
    • Copyright © 2001-2023 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    Как добавить элемент в ассоциативный массив php

    There is another kind of array (php>= 5.3.0) produced by

    $array = new SplFixedArray(5);

    Standard arrays, as documented here, are marvellously flexible and, due to the underlying hashtable, extremely fast for certain kinds of lookup operation.

    Supposing a large string-keyed array

    $arr=[‘string1’=>$data1, ‘string2’=>$data2 etc. ]

    when getting the keyed data with

    php does *not* have to search through the array comparing each key string to the given key (‘string1’) one by one, which could take a long time with a large array. Instead the hashtable means that php takes the given key string and computes from it the memory location of the keyed data, and then instantly retrieves the data. Marvellous! And so quick. And no need to know anything about hashtables as it’s all hidden away.

    However, there is a lot of overhead in that. It uses lots of memory, as hashtables tend to (also nearly doubling on a 64bit server), and should be significantly slower for integer keyed arrays than old-fashioned (non-hashtable) integer-keyed arrays. For that see more on SplFixedArray :

    Unlike a standard php (hashtabled) array, if you lookup by integer then the integer itself denotes the memory location of the data, no hashtable computation on the integer key needed. This is much quicker. It’s also quicker to build the array compared to the complex operations needed for hashtables. And it uses a lot less memory as there is no hashtable data structure. This is really an optimisation decision, but in some cases of large integer keyed arrays it may significantly reduce server memory and increase performance (including the avoiding of expensive memory deallocation of hashtable arrays at the exiting of the script).

    5 years ago

    When creating arrays , if we have an element with the same value as another element from the same array, we would expect PHP instead of creating new zval container to increase the refcount and point the duplicate symbol to the same zval. This is true except for value type integer.
    Example:

    $arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => 23 ];
    xdebug_debug_zval( ‘arr’ );

    (refcount=2, is_ref=0)
    array (size=3)
    ‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
    ‘age’ => (refcount=0, is_ref=0)int 23
    ‘too’ => (refcount=0, is_ref=0)int 23

    but :
    $arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => ’23’ ];
    xdebug_debug_zval( ‘arr’ );

    (refcount=2, is_ref=0)
    array (size=3)
    ‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
    ‘age’ => (refcount=0, is_ref=0)int 23
    ‘too’ => (refcount=1, is_ref=0)string ’23’ (length=2)
    or :

    $arr = [‘bebe’ => ‘Bob’, ‘age’ => [1,2], ‘too’ => [1,2] ];
    xdebug_debug_zval( ‘arr’ );

    (refcount=2, is_ref=0)
    array (size=3)
    ‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
    ‘age’ => (refcount=2, is_ref=0)
    array (size=2)
    0 => (refcount=0, is_ref=0)int 1
    1 => (refcount=0, is_ref=0)int 2
    ‘too’ => (refcount=2, is_ref=0)
    array (size=2)
    0 => (refcount=0, is_ref=0)int 1
    1 => (refcount=0, is_ref=0)int 2

    3 months ago

    This function makes (assoc.) array creation much easier:

    function arr (. $array )< return $array ; >
    ?>

    It allows for short syntax like:

    $arr = arr ( x : 1 , y : 2 , z : 3 );
    ?>

    Instead of:

    $arr = [ «x» => 1 , «y» => 2 , «z» => 3 ];
    // or
    $arr2 = array( «x» => 1 , «y» => 2 , «z» => 3 );
    ?>

    Sadly PHP 8.2 doesn’t support this named arguments in the «array» function/language construct.

    • Типы
      • Введение
      • Система типов
      • NULL
      • Логический тип
      • Целые числа
      • Числа с плавающей точкой
      • Строки
      • Числовые строки
      • Массивы
      • Объекты
      • Перечисления
      • Ресурс
      • Функции обратного вызова (callback-​функции)
      • Mixed
      • Void
      • Never
      • Относительные типы классов
      • Value types
      • Итерируемые
      • Объявление типов
      • Манипуляции с типами
      • Copyright © 2001-2023 The PHP Group
      • My PHP.net
      • Contact
      • Other PHP.net sites
      • Privacy policy

      Массивы в PHP: что это и как с ними работать на примерах

      Массив в PHP (от англ. Array) — это глобальный объект для хранения набора данных упорядоченным образом. Такой упорядоченный список элементов всегда имеет собственный ключ — он называется индексом, а каждое значение в такой коллекции данных — называется элементом.

      Простыми словами, массив в PHP — это набор определённых данных, объединенный под каким-либо названием (другими словами, несколько элементов в пределах одной переменной).

      Зачем они нужны

      Массив — это такая структура данных, которая хранит одно или несколько однотипных значений в одном объекте. Например: вам требуется хранить 500 чисел. И вместо того, чтобы определять 500 переменных напрямую, достаточно определить массив длиной 500.

      И подобные объекты-массивы (array) есть практически во всех популярных языках программирования. По сути — это набор значений однотипных переменных, объединенных общим названием и сгруппированных в зоне распределения.

      Сложно? Тогда, представьте список продуктов. Допустим, нам нужно купить:

      В массиве эти продукты могут выглядеть следующим образом:

      $groceries[0] = "Oranges"; $groceries[1] = "Cheese"; $groceries[2] = "Olives";
      $groceries = array('Oranges','Cheese','Olives');

      Почему массив — это удобно и красиво? Всё просто: он содержит в себе весь список объектов. Можно быстро добавить или удалить объект из списка, например.

      Массив в PHP — не просто метод хранения данных. Скорее — это способ их организации.

      Благодаря таким объектам вы можете создать простейшую базу данных и в дальнейшем управлять её содержимым. И обучение работе с массивами — одна из первых задач, с которыми вы столкнетесь, став программистом на PHP.

      Остались вопросы?
      Укажите ваши данные, и мы вам перезвоним

      Типы массивов: численно-индексированный, ассоциативный, многомерный

      Существует три разных типа таких объектов.

      Запомнить: доступ к каждому значению массива осуществляется с помощью идентификатора, который называется индексом массива.

      1. Численно-индексированный. Это массив с числовым индексом. Доступ к значениям происходит линейно (другими словами, порядок индексов — линейный).
      2. Ассоциативный. Массив со строками в качестве индекса. Элементы находятся в соответствии со значениями ключей (а не в линейном порядке, как в случае с численно-индексированным типом массива).
      3. Многомерный. Массив, содержащий один или несколько массивов, доступ к значениям которых осуществляется с помощью нескольких индексов.

      Разберём каждый из этих типов подробнее.

      Численно-индексированный массив

      Элементы массива адресуются индексами (числами). Такой массив может хранить любые данные, например: числа, строки, иные объекты.

      Метод 1: согласно синтаксису:

      arrayname = array(elements);
      $time=array(30,33,2,55);

      Метод 2: путем прямого присвоения значений (с использованием индекса).

      $time[6]=23;

      Обратите внимание: доступ к элементам массива осуществляется по их индексу.

      arrayname[index]
      echo $time[3];

      Запомнить: индекс всегда начинается с 0.

      Пример

      Ассоциативные массивы

      Элементы в этом типе представлены строковым идентификатором индекса. Этот идентификатор и применяется для доступа к элементам (вместо индекса). Например, вот так:

      arrayname = array( "identifier1" => value2, "identifier2" => value2);
      $ages= array("ab"=>30,"abc"=>33,"dc"=>2);
      arrayname["identifier"]
      echo $ages["dc"];
      Пример
      "45", "Boris"=>"47", "Joanna"=>"53"); echo "Pavel is " . $age['Pavel'] . " years old."; ?>

      Многомерный массив

      Многомерный тип хранит другие массивы по каждому индексу в качестве элемента. Другими словами, многомерные массивы можно представить как «массив массивов».

      $mainarrayname = array( "subarrayname1" => array(elements), "subarrayname2" => array(elements) );
      Пример
      $ages=array( "dev1" => array("a1"=>1,"a2"=>2,"a3"=>3), "com1" => array("h1"=>45,"h2"=>65,"h3"=>35), "man1" => array("m1"=>22,"m2"=>44,"m3"=>5) );
      echo $ages["com1"]["h2"]; prints 65

      Остались вопросы?
      Укажите ваши данные, и мы вам перезвоним

      Как создать массив в PHP

      В PHP для создания массива используется одноименная функция:

      array();

      Но все не так просто. Давайте посмотрим на особенности создания каждого вида массива. Начнём с численно-индексированного.

      Численно-индексированные

      Существует два вида численно-индексированных массивов по типу присвоения индекса:

      1. Автоматическое присвоение. Пример:

      $animals = array("Cat", "Dog", "Mouse");

      (помните: индекс всегда начинается с 0).

      2. Ручное присвоение. Пример:

      $cars[0] = "Cat"; $cars[1] = "Dog"; $cars[2] = "Mouse";

      Ассоциативные

      Напомним: это массивы, использующие «именованные» ключи, которые им присваивают (со строками-индексами).

      Существует два способа создания ассоциативного массива:

      $age = array("Papa"=>"45", "Baba"=>"77", "Mama"=>"53");

      2 способ — более наглядный для объемных списков:

      $age['Papa'] = "45"; $age['Baba'] = "77"; $age['Mama'] = "53".

      Многомерные

      Напомним: это массив, содержащий один или несколько массивов.

      PHP поддерживает многомерные массивы глубиной в два / три / четыре / пять и более уровней. Но начинающим лучше воздержаться от работы с объектами глубже 3-х уровней.

      Размерность указывает на количество индексов, необходимых для выбора элемента. Например:

      • Для выбора элемента двумерного массива нужно два индекса.
      • Для трехмерного — три индекса.
      • И так далее.
      Двумерные массивы

      Двумерный массив — это массив массивов. Трехмерный массив будет массив массивов массивов. И так далее.

      Представим что у нас есть какие-нибудь данные, например, разные предметы одежды. Для удобства определим их в таблицу:

      Название

      В наличии (in stock)

      Продано (sold)

      Массивы в php

      Массивы в PHP (как и в других языках) представляют собой коллекцию связанных вместе значений. Например в виде массива можно представить меню в ресторане (название блюда — цена) или количество проживающих в городах страны жителей (город страны — количество жителей). Как пояснялось в этой статье, переменная представляет из себя именнованный контейнер в памяти, содержащий определённо значение. В этом смысле массив, это контейнер содержащий множество значений.

      Организация массива

      Как писалось выше, массив состоит из элементов, каждый из которых имеет ключ и значение. Например массив содержащий информацию о ценах в ресторанном меню может выглядеть так:

      Ключ Значение
      breakfast 700
      dinner 1500
      supper 1100

      Массив может иметь только один элемент с заданным ключом, т.е. в приведённом выше массиве не может быть двух элементов с ключом dinner . При попытке «добавить» второй dinner , мы просто перезапишем значение уже существующего элемента. В данном примере мы рассмотрели наиболее частый случай организации массива, а именно в виде ассоциативного. Ассоциативный массив удобнее использовать в коде, т.к. его ключи имеют осмысленные наименования (ассоциируются с какими-то частями приложения или данными которые обрабатывает скрипт). Но есть более простой пример массив, это числовые массивы. При их создании не нужно указывать ключ, он задаётся автоматически в виде целого числа, начиная с нуля.

      Ключ Значение
      0 700
      1 1500
      2 1100

      Рассмотрим пример:

       //Пример создания ассоциативного массива $menuPrice = [ 'breakfast' => 700, 'dinner' => 1500, 'supper' => 1100 ]; //Пример создания «числового» массива $prices = [700, 1500, 1100]; 

      В первом случае элементы массива представляют из себя пару ключ-значение, где в качестве ключа используются строковые названия «блюд» (приёмов пищи на самом деле, но пусть будет блюд), а значение это цена блюда. Во втором же случае я указал только цены, при этом интерпретатор PHP автоматически проставит ключи элементам массива.

      Операции с массивами

      Один из случаев ключевой операции с массивами, а именно его создание мы рассмотрели выше. А как ещё можно создать массив? Самый простой случай, это создание пустого массива:

       //Создаём пустой массив $array = []; 

      Создание и модификация массива

      Пустой массив может служить заготовкой под определённую коллекцию данных. Конечно его можно не определять заранее и создать прямо в цикле где он должен заполняться, но тогда это будет менее понятный код.

      Вы так же можете заполнить массив на лету, например данными из базы данных:

       //Заполняем массив данными из БД $users = []; //. некая выборка значения, например пользователей users while($user = $db->query('SELECT * FROM users')->fetch(PDO::FETCH_ASSOC))

      Перебор массивов

      С другой стороны готовый массив можно перебрать и например вывести его элементы на экран:

        ‘; foreach ($week as $key => $day) < echo '
      • ‘. $day .»; > echo ‘

      Вообще в php существует больше 70 функций для работы с массивами, однако в большинстве случаев вы будет использовать не больше двадцати. Приведу некоторые из них:

      • in_array — проверяет присутствие элемента в массиве
      • key_exists — проверяет присутствует ли в массиве указанный ключ или индекс
      • array_search — осуществляет поиск заданного значения в массиве и возвращает ключ первого найденного значения
      • array_merge — объединяет 2 и более массивов в один
      • array_chunk — разбивает массив на части

      Сортировка массива

      Отдельным блоком может идти операции связанные с сортировкой массив. В PHP существует несколько встроенных функций для быстрой сортировки массивов, например по возрастанию/убыванию значения или в алфавитном порядке. Причём сортировка может идти как по ключам массива так и по значениям. Одной из интересных возможностей предоставляет функция usort() , при помощи которой вы можете отсортировать элементы массива используя собственный алгоритм сравнения. Рассмотрим пример:

       //Пользовательская функция сравнения элементов массива function compare($a, $b) < if ($a == $b) < return 0; >return ($a < $b) ? -1 : 1; >//Заданный массив с числами идущими не по порядку $numbers = [3, 2, 5, 6, 1]; //Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения usort($numbers, 'compare'); 

      В результате выполнения данного примера получим такой массив:

       array(5) < [0]=>int(1) [1]=>int(2) [2]=>int(3) [3]=>int(5) [4]=>int(6) > 

      Как вы понимаете данный пример максимально упрощён. Но внутри вашей функции compare() можно реализовать любой алгоритм сравнения элементов. Главное правильно возвращать значение, ноль — если элементы не отличаются и их не надо менять местами и 1 или -1 если нужно изменить порядок элементов.

      Вы так же можете пробросить в тело функции compare() внешнюю переменную используя анонимную функцию и ключевое слово use :

       //Пользовательская функция сравнения элементов массива $params = ['min_value'=>0, 'max_value'=>3]; function compare($params) < return function ($a, $b) use ($params) < if ($a == $b) < return 0; >if($a < $b && $a >= $params['min_value'] && $a else < return 1; >>; > //Заданный массив с числами идущими не по порядку $numbers = [3, 2, 5, 6, 1]; //Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения usort($numbers, compare($params)); 

      Как видите теперь compare() принимает параметры $params и возвращает анонимную функцию в которой уже реализован ваш алгоритм сравнения в котором используются переданные параметры. Результат при таком алгоритме изменится:

       array(5) < [0]=>int(1) [1]=>int(2) [2]=>int(3) [3]=>int(6) [4]=>int(5) > 

      Грубо говоря сортировка по возрастанию шла пока значение $a попадало в диапазон от 0 до 3-х. Более подробно о сортировке массивов читайте в отдельной статье.

      Объединение массивов

      Для объединения двух и более массивов в php предусмотрена функция array_merge() . Она создаёт новый массив последовательно присоединяя массивы.

       //Фрукты $fruits = [ 'Яблоки', 'Апельсины', 'Грушки' ]; //Овощи $vegetables = [ 'Картофель', 'Огурцы', 'Помидоры' ]; //Объединяем массивы $plants = array_merge($fruits, $vegetables); echo '
      '; print_r($plants); echo '

      ';

       Array ( [0] => Яблоки [1] => Апельсины [2] => Грушки [3] => Картофель [4] => Огурцы [5] => Помидоры ) 

      Разделение массива на части

      Чтобы разделить массив на части, используйте функцию array_chunk() принимающую 2 аргумента, сам массив и число указывающее на то, по сколько частей делить исходный массив. Функция создаст новый многомерный массив, разделённый на части.

       //Фрукты $fruits = [ 'Яблоки', 'Апельсины', 'Грушки', 'Слива', 'Персик', 'Абрикос', 'Алыча', 'Вишня', 'Черешня', ]; $arr = array_chunk($fruits, 3); //Делим массив, оставляя в каждом подмассиве 3 элемента из исходного echo '
      '; print_r($arr); echo '

      ';

       Array ( [0] => Array ( [0] => Яблоки [1] => Апельсины [2] => Грушки ) [1] => Array ( [0] => Слива [1] => Персик [2] => Абрикос ) [2] => Array ( [0] => Алыча [1] => Вишня [2] => Черешня ) ) 

      В исходном массиве 9 элементов, мы делим его на массивы по 3 элемента в каждом, получаем в итоге 3 массива. Если исходный массив не делится поровну, последний подмассив, будет содержать то, что осталось в исходном после разделения на предыдущие. Например если в данном примере в качестве второго аргумента передать array_chunk() число 4 получим такой результат:

       Array ( [0] => Array ( [0] => Яблоки [1] => Апельсины [2] => Грушки [3] => Слива ) [1] => Array ( [0] => Персик [1] => Абрикос [2] => Алыча [3] => Вишня ) [2] => Array ( [0] => Черешня ) ) 

      2 массива по 4 элемента и 1 с оставшимся одним элементом.

      Получение элементов массива

      Помимо обычного перебора или обращения по индексу или ключу, в php предусмотрен набор функций для получения определённых элементов или частей массива.

      Получить первый элемент массива

      Функция current() получает первый элемент массива, точнее элемент на который в данный момент указывает внутренний указатель массива. По умолчанию первый элемент.

       $arr = [ 'Первый элемент', 'Второй элемент', 'Третий элемент', 'Четвёртый элемент', 'Пятый элемент', 'Шестой элемент', 'Седьмой элемент', 'Восьмой элемент', 'Девятый элемент', 'Десятый элемент', ]; //По умолчанию первый элемент var_dump(current($arr)); 
       string(27) "Первый элемент" 

      Однако мы можем сдвинуть указатель функциями next() , prev() и получить другой результат.

       $arr = [ 'Первый элемент', 'Второй элемент', 'Третий элемент', 'Четвёртый элемент', 'Пятый элемент', 'Шестой элемент', 'Седьмой элемент', 'Восьмой элемент', 'Девятый элемент', 'Десятый элемент', ]; //Сдвинем внутренний указатель на 2 шага next($arr); next($arr); var_dump(current($arr)); 
       string(27) "Третий элемент" 

      Функция reset() сбросит указатель опять на первый элемент.

      Получить последний элемент массива

      Опять работаем с указателями, функция end() поставит указатель на последний элемент массива.

       $arr = [ 'Первый элемент', 'Второй элемент', 'Третий элемент', 'Четвёртый элемент', 'Пятый элемент', 'Шестой элемент', 'Седьмой элемент', 'Восьмой элемент', 'Девятый элемент', 'Десятый элемент', ]; var_dump(end($arr)); 
       string(29) "Десятый элемент" 

      Получить часть массива

      В php предусмотрена возможность получить часть (срез) массива. Основано на внутенних индексах элементов массива, подобно работе со строками, мы передаём функции array_slice($arr, $offest, $length) три аргумента, наш массив $arr индекс $offest элемента с которого нужно начать делать срез и $leng th — длину среза.

       $arr = [ 'Первый элемент', 'Второй элемент', 'Третий элемент', 'Четвёртый элемент', 'Пятый элемент', 'Шестой элемент', 'Седьмой элемент', 'Восьмой элемент', 'Девятый элемент', 'Десятый элемент', ]; $slice = array_slice($arr, 2, 5); echo '
      '; print_r($slice); echo '

      ';

       Array ( [0] => Третий элемент [1] => Четвёртый элемент [2] => Пятый элемент [3] => Шестой элемент [4] => Седьмой элемент ) 

      Если $length будет больше чем количество элементов оставшихся в массиве с индекса $offset , мы просто получим массив до конца.

      Извлечь первый элемент из массива

      Иногда при обработке массивов, нам нужно не просто получить его элемент, но при этом и удалить его в исходном массиве, чтобы он не участвовал в последующих операциях над массивом. Для этого предусмотрена функция array_shift() — извлекает и возвращает первый элемент массива.

       $arr = [ 'Первый элемент', 'Второй элемент', 'Третий элемент', ]; $firstItem = array_shift($arr); echo $firstItem . '
      '; echo '
      '; print_r($arr); echo '

      ';

       Первый элемент Array ( [0] => Второй элемент [1] => Третий элемент ) 

      Извлечь последний элемент из массива

      Есть аналог array_shift(), функция array_pop() — извлекает последний элемент из массива и возвращает его значение

       $arr = [ 'Первый элемент', 'Второй элемент', 'Третий элемент', ]; $firstItem = array_pop($arr); echo $firstItem . '
      '; echo '
      '; print_r($arr); echo '

      ';

       Третий элемент Array ( [0] => Первый элемент [1] => Второй элемент ) 

      Извлечь часть элементов из массива

      Подобную операцию можно провернуть над частью массива, предварительно получив срез с помощью array_slice() а затем воспользовавшись array_diff() мы получим разницу между исходным массивом и срезом.

      $arr = [ 'Первый элемент', 'Второй элемент', 'Третий элемент', ]; $slice = array_slice($arr, 0, 2); //Срез $diff = array_diff($arr, $slice); //Разница между срезом и исходным массивом echo '
      '; print_r($slice); echo '

      '; echo '

      '; print_r($diff); echo '

      ';

       Array ( [0] => Первый элемент [1] => Второй элемент ) Array ( [2] => Третий элемент ) 

      Так иногда решают задачи не стандартной сетки в вёрстке, когда в первой строке выводится 2 элемента, во второй 3, начиная с 3-й строки по 4. Можно предварительно попилить массив с товарами на такие отрезки и удобно в цикле выводить их на странице.

      Выбрать все значений массива

      Для получения всех значений массива (игнорируя ключи) используется функция array_values(), она создаёт новый массив со стандартными числовыми ключами (0, 1, 2 . ) оставляя в новом массиве только значения.

       $arr = [ 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3', ]; $values = array_values($arr); echo '
      '; print_r($values); echo '

      ';

       Array ( [0] => value1 [1] => value2 [2] => value3 ) 

      Выбрать все ключи массива

      Аналогично значениям, вы можете получить только ключи массива.

       $arr = [ 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3', ]; $values = array_keys($arr); echo '
      '; print_r($values); echo '

      ';

       Array ( [0] => key1 [1] => key2 [2] => key3 ) 

      Получить случайное значение из массива

      Если вы пишите программу лотереи а призы харните в массиве, воспользуйтесь функцией array_rand() чтобы отдать игроку случайны приз, она получает и возвращает случайны индекс массива.

       $arr = [ 'пусто', 'пусто', 'пусто', 'Автомоболь!', 'пусто', 'пусто', ]; var_dump($arr[array_rand($arr)]); 
       string(10) "пусто" 

      Эх, повезёт в следующий раз.

      Глобальные массивы

      В PHP начиная с версии 4 ввели такой сущность как «суперглобальные массивы». Это особые переменные доступные в любой части приложения и содержат информацию, например о состоянии сервера (массив $_SERVER) сессии, куках или переданных от пользователя запросах, одним словом о состоянии среды выполнения приложения. На данный момент в PHP доступно девять суперглобальных массивов:

      Наименование Описание массива
      $GLOBALS Этот массив содержим все переменные объявленные в скрипте, при этом имена переменных являются ключами этого массива.
      $_SERVER Данный массив содержит всю информацию о сервере, а так же настройки среды в которой выполняется скрипт
      $_GET Массив переменных переданных PHP скрипту по средствам GET запроса (через адресную строку браузера или другими методами, например curl())
      $_POST Так же как и GET содержит переданные скрипту переменные, только уже методом POST
      $_COOKIE Содержим coockies-ы пользователя
      $_REQUEST Объединяет в себе массивы $GET, $POST и $COOKIE. Не рекомендуется использовать, не безопасно, хотя и удобно.
      $_FILES Содержим список файлов загружаемых на сервер через веб-формы (имя, временный путь, размеры и т.д.)
      $_ENV Содержит переменные окружения в котором запущен PHP скрипт
      $_SESSION В данном массиве содержаться все переменные сессии текущего пользователя

      Чаще всего, вы будете сталкиваться с массивами $_GET и $_POST т.к. с их помощью в скрипты на сервере передаются данные от клиентской части (через веб-формы).

      Многомерные массивы

      Как вы уже знаете, элементы массива могут содержать в качестве значения данные любого типа, строки, числа, логические, в том числе и другие массивы. Массив состоящий из других массивов называется многомерным или вложенным массивом. На практике используется 2-3 уровня вложенности для хранения каких-либо связанных структурных данных (например данных о покупателях магазина или каталоге товаров), обработка массивов большей вложенности усложняется и используется не часто.

      Давайте разберёмся как создавать и взаимодействовать с многомерными массивами.

      Создание многомерных массивов

      В первую очередь создадим простой двумерный массив сотрудников организации:

       //Многомерный массив сотрудников $multilevelArray1 = [ [ 'username'=>'Александр', 'age' => 32, 'position' => 'Программист' ], [ 'username'=>'Анастасия', 'age' => 33, 'position' => 'Логопед' ], [ 'username'=>'Елена', 'age' => 29, 'position' => 'Бухгалтер' ] ]; 

      Массив $multilavelArray содержим в себе три других массива описывающих некоторые параметры сотрудников, а именно имя, возраст и должность. Эти данные могли бы быть получены из БД или сложной веб-формы.

      Обратите внимание что в «родительском» массиве мы не указывали символьных ключей, поэтому массивам внутри были просто присвоены числовые индексы 0, 1, 2. Давайте теперь распределим наших сотрудников по отделам и добавим ещё одного сотрудника.

       //Многомерный массив сотрудников $multilevelArray2 = [ 'DEPARTMENT_IT' => [ [ 'username'=>'Александр', 'age' => 32, 'position' => 'Программист' ] ], 'DEPARTMENT_EDUCATION'=> [ [ 'username'=>'Анастасия', 'age' => 33, 'position' => 'Логопед' ] ], 'DEPARTMENT_FINANCE' => [ [ 'username'=>'Екатерина', 'age' => 39, 'position' => 'Главный бугалтер' ], [ 'username'=>'Елена', 'age' => 29, 'position' => 'Бухгалтер' ] ] ]; 

      Теперь мы имеем многомерный массив в котором на «первом уровне» хранятся отделы компании, а уже внутри отделов сотрудники. При этом отдел имеет символьный ключ, например DEPARTMENT_IT — отдел IT. Немного усложним наш пример и добавим информацию о наименовании отделов и времени работы, а сотрудников отдела поместим на уровень ниже:

       $multilevelArray3 = [ 'DEPARTMENT_IT' => [ 'TITLE' => 'It отдел', 'WORK_TIME' => 'с 09:00 до 23:00', 'STAFF' => [ [ 'username'=>'Александр', 'age' => 32, 'position' => 'Программист' ] ] ], 'DEPARTMENT_EDUCATION'=> [ 'TITLE' => 'Отдел образования и развития', 'WORK_TIME' => 'с 08:00 до 17:00', 'STAFF' => [ [ 'username'=>'Анастасия', 'age' => 33, 'position' => 'Логопед' ] ] ], 'DEPARTMENT_FINANCE' => [ 'TITLE' => 'Отдел бухгалтерии', 'WORK_TIME' => 'с 09:00 до 18:00', 'STAFF' =>[ [ 'username'=>'Екатерина', 'age' => 39, 'position' => 'Главный бухгалтер' ], [ 'username'=>'Елена', 'age' => 29, 'position' => 'Бухгалтер' ] ] ] ]; 

      Как видите используя многомерные массивы можно строить довольно сложные структуры данных с которыми в последствии предстоит работать нашему веб-приложению.

      Доступ к элементам многомерного массива

      Рассмотрим как получить доступ к элементам многомерного массива. В качестве примера возьмём выше описанные массивы сотрудников компании. Но перед этим предлагаю набросать небольшую функцию, которая позволит удобно просматривать содержимое переменных в вашем коде. Я часто использую её в работе:

       /** * Обёртка для print_r() и var_dump() * @param $val - значение * @param string $name - заголовок * @param bool $mode - использовать var_dump() или print_r() * @param bool $die - использовать die() после вывода */ function print_p($val, $name = 'Содержимое переменной', $mode = false, $die = false)< echo '
      '.(!empty($name) ? $name.': ' : ''); if($mode) < var_dump($val); >else < print_r($val); >echo '

      '; if($die) die; >

      Эта функция простая обёртка для просмотра содержимого переменной при помощи print_r() или var_dump() тегов

      .

      . Берите на вооружение.

      И так, давайте узнаем имена и возраст всех сотрудников из первого двумерного массива:

       echo '

      Сотрудники компании

      '; foreach ($multilevelArray1 as $key => $item) < echo 'Имя: ' . $item['username'] . ' должность: ' . $item['position'] . '
      '; >

      Сотрудники компании

      В результате выполнения этого кода, получим такой список в html:

      Представьте что мы не знаем что содержится в переменной $multilevelArray3 , но нас просят как-то представить структуру компании на странице «О компании». Тут нам пригодится функция print_p() описанная выше. Вызовем следующий код:

       //Просмотр переменной $multilevelArray3 print_p($multilevelArray3, 'Структура компании', true); 

      Многомерный массив

      В результате, на экране мы увидим такое сообщение:

      Мы видим что в $multilevelArray3 хранится многоуровневый массив, на первом уровне которого находятся разделы компании с описанием, а внутри разделов по ключу STAFF доступен массив сотрудников этого отдела. Зная это мы можем написать следующий код, чтобы представить структуру компании:

      Структура компании

      Получим такую страницу:

      Таким образом можно вывести например страницу контактов сайта, на которой должны быть «координаты» должностных лиц отвечающих за то или иное направление деятельности компании. Оформление сами понимаете зависит от вашей фантазии и дизайна сайта.

      Обработка многомерного массива

      Один из примеров обработки массива был представлен выше, когда мы просто вывели на экран содержимое многомерного массива в удобном для пользователя виде. Однако это далеко не всё что можно делать с массивами. Например мы можешь осуществить некий поиск по элементам узнать сколько сотрудников старше 30 лет работает в нашей компании:

       //Количество искомых сотрудников $counter = 0; //Обработка каждого элемента массива array_walk_recursive( $multilevelArray3, function ($value, $key) use (&$counter) < if($key == 'age')< if($value >30) < $counter++; >> >, $counter); echo 'Количество сотрудников старше 30 лет: ' . $counter; 

      Здесь мы применили функцию array_walk_recursive() которая обходит каждый элемент массива вне зависимости от его вложенности и применяет к элементу пользовательскую функцию. В данном случае лямбда функция проверяет что текущий элемент это возраст и что его значение больше 30 и наращивает определённый во вне счётчик. Чтобы получить доступ в область видимости где применён счётчик используется конструкция use и ссылка на переменную &$counter . В результате вы увидите сообщение: Количество сотрудников старше 30 лет: 3.

      Существует множество примеров обработки массивов в PHP, но они выходят за рамки данной статьи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *