Verification: a143cc29221c9be0

Php array search ассоциативный массив

Допустим у нас есть массив

$arr = [
	2 => 'Виноград',
	1 => 'Арбуз',
	3 => 'Банан',
];

Он неправильно отсортирован, как видите ключи (1,2,3) и значения (виноград, арбуз, банан) идут не по порядку. Давайте это исправим:

Сортировка массива по ключу

ksort($arr); // По возрастанию
krsort($arr); // По убыванию

Сортировка массива по значению

sort($arr);// По возрастанию 
asort($arr);// По возрастанию, сохраняет ключи
rsort($arr); // По убыванию
arsort($arr); // По убыванию, сохраняет ключи
array_reverse($arr); // От конца к началу
array_reverse($arr, true); // От конца к началу, сохраняет ключи
shuffle($arr); // Перемешать массив в случайном порядке

Свои способы сортировки

Если предложенные способы сортировки вам не подходят, то можно создать свой способ сортировки ключей и значений массивов. Для этого есть 3 функции uasort, uksort и usort. С их помощью мы можем задать свою callback функцию, которая будет сравнивать элементы между собой и определять какой из них "больше" и какой "меньше".

  • uasort — Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей
  • uksort — Сортирует массив по ключам, используя пользовательскую функцию для сравнения ключей
  • usort — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов

Принцип работы следующий, мы создаем callback функцию сравнения по какому-то необычному признаку. Она должна сравнивать элементы и возвращать одно из трех значений: -1, 0 или 1

Давайте рассмотрим как они работают напримере функции uasort, которая сравнивает значения с сохранением ключей.

// Наша функция сравнения
$callbackCmpFunction = function cmp($a, $b) {
    if ($a == $b) { // если 2 значения массива равны
        return 0; // вернем 0
    }
    return ($a 
  • -1 - возвращается, когда элемент, который слева больше правого
  • 0 - когда элементы равны
  • 1 - когда правый больше левого

Применить нашу новую функцию можно так:

// Сортируемый массив
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);

// Сортируем и выводим получившийся массив
uasort($array, $callbackCmpFunction); // вторым параметром указываем нашу callback функцию
print_r($array);

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

Функции без сохранения ключей sort и rsort, сбрасывают ключи и они начинают идти по порядку (0, 1, 2, ...)

Иногда бывает полезно одно, иногда - другое. В зависимости от задачи.

Если сортировка не дает ожидаемый результат, то изучите флаги сортировки. По умолчанию используется обычный тип сортировки SORT_REGULAR

Флаги типа сортировки:

  • SORT_REGULAR - обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC - числовое сравнение элементов
  • SORT_STRING - строковое сравнение элементов
  • SORT_LOCALE_STRING - сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL - сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE - можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра. Пример: sort($arr, SORT_NATURAL | SORT_FLAG_CASE)

Флаг сортировки передается в функцию сортировки, например так:

sort($arr, SORT_STRING); 

Подробнее о том, как работают флаги сортировки и зачем они нужны.

Сортировка многомерных массивов

Создадим функцию, которая нам поможет в сортировке массивов

// создадим функцию которая нам поможет в сортировке массивов
function array_orderby()
{
    $args = func_get_args();
    $data = array_shift($args);
    foreach ($args as $n => $field) {
        if (is_string($field)) {
            $tmp = array();
            foreach ($data as $key => $row)
                $tmp[$key] = $row[$field];
            $args[$n] = $tmp;
            }
    }
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}

Пример работы этой функции array_orderby():

$data = [
	['volume' => 67, 'edition' => 2],
	['volume' => 86, 'edition' => 1],
	['volume' => 85, 'edition' => 6],
	['volume' => 98, 'edition' => 2],
	['volume' => 86, 'edition' => 6],
	['volume' => 67, 'edition' => 7],
];
	
// Сортируем массив $data сначала по volume, затем по edition
$sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
// SORT_ASC - по возрастанию
// SORT_DESC - по убыванию

print_r($sorted); // выводим результат

Если вам нужно что-то совсем уж специфическое при сортировки многомерных массивов

Можете создать и другие callback функции сортировки самостоятельно.

$data = [
	['volume' => 67, 'edition' => 2],
	['volume' => 86, 'edition' => 1],
	['volume' => 85, 'edition' => 6],
	['volume' => 98, 'edition' => 2],
	['volume' => 86, 'edition' => 6],
	['volume' => 67, 'edition' => 7],
];

// Создадим 2 функции
function cmp_function($a, $b){ // volume по возрастанию
	return ($a['volume'] > $b['volume']);
}

function cmp_function_desc($a, $b){ // volume по убыванию
	return ($a['volume'] 


Что такое JSON

JSON расшифровывается как аббревиатура от J ava S cript O bject N otation. JSON — это стандартный текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}.

В JSON, ключи всегда строки, в то время как значение может быть string, number, true или false, null, object или array. Строки должны быть заключены в двойные кавычки "и могут содержать управляющие символы, такие как \n, \tи \. JSON более компактный, чем xml, поэтому он более предпочтителен для обмена данными между веб-браузером и сервером.

Синтаксис JSON на примерах

Объект JSON может выглядеть так:

Пример

{
  "ФИО" : "Иванов Иван",
  "Адрес" : {
    "Город" : "Киров",
    "Улица" : "Вербицкого",
    "Дом" : "7"
  }
}

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

Пример

{
    "smarts": [
        "Apple",
        "ASUS",
        "Huawei",
        "Lenovo"
    ]
}

PHP и JSON

Структуры данных JSON очень похожи на массивы PHP. В языке PHP существуют специальные функции для кодирования и декодирования данных JSON. Это функции json_encode() и json_decode() соответственно. Они уже встроены в ядро PHP, поэтому никаких библиотек подключать не нужно. Обе функции работают только со строковыми данными в кодировке UTF-8.

Кодирование данных JSON в PHP

В PHP функция json_encode() используется для кодирования значения в формат JSON. Кодируемое значение может быть любым типом данных PHP, кроме ресурса, такого как база данных или дескриптор файла.

Синтаксис

string json_encode ($value [, int $options = 0 [, int $depth = 512 ]] )

Параметры

value
- значение, которое будет закодировано. Может быть любого типа за исключением resource. Все строковые данные должны быть в кодировке UTF-8.
options
Битовая маска составляемая из значений JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE.
depth
Задает максимальную глубину. Должен быть больше нуля.

В приведенном ниже примере показано, как кодировать ассоциативный массив PHP в объект JSON:

65, "Harry"=>80, "John"=>78, "Clark"=>90);
 
echo json_encode($marks);
?>

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

{"Peter": 65, "Harry": 80, "John": 78, "Clark": 90}

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

65, "Игорь"=>80, "Денис"=>78, "Николай"=>90);
 
echo json_encode($marks);
?>

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

{"\u041f\u0451\u0442\u0440":65,"\u0418\u0433\u043e\u0440\u044c":80,"\u0414\u0435\u043d\u0438\u0441":78,"\u041d\u0438\u043a\u043e\u043b\u0430\u0439":90}

Как видно кириллица кодируется, исправляется это добавлением опции: JSON_UNESCAPED_UNICODE.

65, "Игорь"=>80, "Денис"=>78, "Николай"=>90);
 
echo json_encode($marks, JSON_UNESCAPED_UNICODE);
?>

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

{"Пётр": 65, "Игорь": 80, "Денис": 78, "Николай": 90}

Точно так же вы можете закодировать индексированный массив PHP в массив JSON, например:

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

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

["Красный","Зелёный","Синий","Оранжевый","Жёлтый"]

Если применить параметр JSON_FORCE_OBJECT, то функция json_encode() будет возвращать индексированный массив PHP как объект JSON:

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

{"0":"Apple","1":"ASUS","2":"Huawei","3":"Lenovo","4":"Samsung"}

Примечание: Неассоциативный массив может быть закодирован как массив или объект. Однако ассоциативный массив всегда кодируется как объект.

Декодирование данных JSON в PHP

Функция PHP json_decode() используется для декодирования JSON в PHP. Эта функция возвращает значение, декодированное из json в соответствующий тип данных PHP.

Синтаксис

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

Параметры

json
- json строка (string) для декодирования. Эта функция работает только со строками в UTF-8 кодировке.
assoc
Если TRUE, возвращаемые объекты будут преобразованы в ассоциативные массивы.
depth
Указывает глубину рекурсии.
options
Битовая маска опций декодирования JSON. В настоящий момент поддерживается только JSON_BIGINT_AS_STRING (по умолчанию большие целые числа приводятся к числам с плавающей запятой (float))

В следующем примере показано, как декодировать или преобразовать объект JSON в объект PHP:

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

object(stdClass)#1 (4) { ["Peter"]=> int(65) ["Harry"]=> int(80) ["John"]=> int(78) ["Clark"]=> int(90) }

Функция json_decode() по умолчанию возвращает объект. Если нужно JSON декодировать в ассоциативный массив, то укажите значение второго параметра $assoc в качестве true. По умолчанию его значение — false:

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

array(4) { ["Peter"]=> int(65) ["Harry"]=> int(80) ["John"]=> int(78) ["Clark"]=> int(90) }

Доступ к декодированным значениям JSON в PHP

Теперь рассмотрим пример, который показывает, как декодировать данные JSON и получить доступ к отдельным элементам объекта JSON в PHP:

Peter; // вывод 35
echo $obj->Ben;   // вывод 37
echo $obj->Joe;   // вывод 43
?>

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

Вы также можете перебирать декодированные данные с помощью цикла foreach(), например:

$value){
    echo $key . "=>" . $value . "
"; } echo "
"; // Декодируем данные JSON в объект PHP $obj = json_decode($json); // Перебираем в цикле значения объекта foreach($obj as $key=>$value){ echo $key . "=>" . $value . "
"; } ?>

Кодирование при помощи функции json_encode

Функция работает только с кодировкой UTF-8.

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

$array = [
    'one' => 1,
    'two' => 2,
];

$json = json_encode($array);

echo $json; 

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

{"one":1,"two":2}

Как видим ассоциативный массив превратился в обычную json строку.

Более сложный пример:

$array = [
    'Ключ 1' => 'Значение 1',
    'Ключ 2' => 'Значение 2',
    'Ключ 3' => 'Значение 3',
];

$json = json_encode($array);

echo $json;

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

{"\u041a\u043b\u044e\u0447 1":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1","\u041a\u043b\u044e\u0447 2":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2","\u041a\u043b\u044e\u0447 3":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3"}

Что произошло c кириллицей?

Дело в том, что по умолчанию многобайтовые символы Unicode кодируются как \uXXXX. При раскодировании функцией json_decode они преобразуются в нормальные строки. В некоторых случаях мы можем захотеть избежать этого экранирования, например, чтобы посмотреть как выглядит наш JSON.

Для этого воспользуемся флагом JSON_UNESCAPED_UNICODE:

$json = json_encode($array, JSON_UNESCAPED_UNICODE);

echo $json;

Получаем такой результат:

{"Ключ 1":"Значение 1","Ключ 2":"Значение 2","Ключ 3":"Значение 3"}

Мы может еще в целях изучения кода преобразовать его в более человеческий вид, при помощи дополнительного флага JSON_PRETTY_PRINT

$json = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

echo $json;

Получаем такой результат:

{
    "Ключ 1": "Значение 1",
    "Ключ 2": "Значение 2",
    "Ключ 3": "Значение 3"
}

Мы разобрались, как кодировать наши переменные в формат JSON при помощи json_encode.

Более подробная информация об этой функции: https://www.php.net/manual/ru/function.json-encode.php

Другие предопределенные константы с префиксом JSON_ https://www.php.net/manual/ru/json.constants.php

Декодирование c помощью json_decode

Допустим у нас есть строка в формате JSON. Возьмем ее из предыдущего примера:

$json = '{"Ключ 1":"Значение 1","Ключ 2":"Значение 2","Ключ 3":"Значение 3"}';

Давайте раскодируем ее:

$var = json_decode($json);

var_dump($var);

У нас получился результат:

object(stdClass)#117 (3) {
  ["Ключ 1"]=>
  string(18) "Значение 1"
  ["Ключ 2"]=>
  string(18) "Значение 2"
  ["Ключ 3"]=>
  string(18) "Значение 3"
}

Видим, что это тип переменной stdClass. То есть несмотря на то, что мы изначально кодировали в json обычный ассоциативный массив, в результате декодирования у нас получился объект. Подробнее об этом поведении написано здесь: https://phpstack.ru/php/json_decode-kak-perevesti-rezultat-v-massiv.html

Как нам все таки получить обычный массив? Нужно в json_decode передать вторым параметром true:

$var = json_decode($json, true);

var_dump($var);

Получаем результат:

array(3) {
  ["Ключ 1"]=>
  string(18) "Значение 1"
  ["Ключ 2"]=>
  string(18) "Значение 2"
  ["Ключ 3"]=>
  string(18) "Значение 3"
}

Теперь мы получили обычный массив. Таким образом разобрались как работать с функцией json_decode для декодирования строки формата JSON.

Более подробная информация об этой функции: https://www.php.net/manual/ru/function.json-decode.php

Обработка ошибок

В случае ошибки, эти функции просто молча возвращают null.

Мы можем проверить, что нам вернулось null и посмотреть какая произошла ошибка следующим образом:

$json = '{{{ некорректный JSON!';

$var = json_decode($json, true);

if($var === null) {
    echo json_last_error_msg(); // эта строка выведет: Syntax error
}

Иногда нам может быть полезно не молчаливо возвращать null, а выкинуть Exception и обработать его. PHP >7.3 предоставляет нам такую возможность.

Это можно сделать при помощи флага JSON_THROW_ON_ERROR

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

$json = '{{{ некорректный JSON!';

$var = json_decode($json, true, JSON_THROW_ON_ERROR);

Теперь результат этого кода JsonException с сообщением Syntax error

Более подробно про обработку ошибок JSON:

https://www.php.net/manual/ru/function.json-last-error-msg.php

https://www.php.net/manual/ru/function.json-last-error.php

Как вывести JSON ответ на ajax запрос

Когда к нашему PHP скрипту обращается например javascript с ajax запросом, для того, чтобы подгрузить на страницу новые данные, то часто возникает необходимость ответить в формате JSON.

Для того, чтобы это сделать, нужно отправить заголовок Content-type:application/json;charset=utf-8 и просто вывести строку с закодированными данными.

Содержимое файла text_json.php

$array = ['data' => 'ваши данные'];
$jsonString = json_encode($array); // переводим данные в JSON строку

// отправляем заголовок, который позволит клиенту определить, 
// что возвращается ответ в формате JSON
header('Content-type:application/json;charset=utf-8'); 

echo $jsonString; // выводим JSON строку

exit(); // прекращаем выполнение скрипта

Тем временем в javascript мы можем обратиться к нашему php скрипту таким образом:

$('.js-button').on('click', function(){
    $.ajax({
        url: '/text_json.php',
        type: 'get',
        success: function(response) {
            // выводим alert со строкой "ваши данные", 
            // которую мы только что получили из php
            alert(response.data); 
        }
    });
});

Задача

Необходимо узнать, содержит ли массив определенное значение.

Решение

Используйте функцию in_array():

if (in_array($array, $value)) {
        // в массиве $array есть элемент со значением $value
}

Цикл each (jQuery.each). Примеры использования

Синтаксис функции each:

// array или object - массив или объект, элементы или свойства которого необходимо перебрать
// callback - функция, которая будет выполнена для каждого элемента массива или свойства объекта
$.each(array или object,callback);

Работу с функцией each разберём на примерах.

Пример №1. В нём выполним переберор всех элементов массива (array).

// массив, состоящий из 3 строк
var arr = ['Автомобиль','Грузовик','Автобус'];

// переберём массив arr
$.each(arr,function(index,value){

  // действия, которые будут выполняться для каждого элемента массива
  // index - это текущий индекс элемента массива (число)
  // value - это значение текущего элемента массива
  
  //выведем индекс и значение массива в консоль
  console.log('Индекс: ' + index + '; Значение: ' + value);

});

/*
Результат (в консоли):
Индекс: 0; Значение: Автомобиль
Индекс: 1; Значение: Грузовик
Индекс: 2; Значение: Автобус
*/

В вышеприведённом коде функция each используется для перебора массива. Функция имеет 2 обязательных параметра. Первый параметр - это сущность (массив или объект), элементы (свойства) которой необходимо перебрать. В данном случае - это массив arr. Второй параметр - это функция обратного вызова, которая будет выполнена для каждого элемента (в данном случае) массива. Она имеет 2 параметра, которые доступны внутри неё посредством соответствующих переменных. Первый параметр - это порядковый номер элемента (отсчёт выполняется с 0). Второй параметр - это значение текущего элемента массива.

Пример №2. В этом примере осуществим перебор всех свойств объекта.

// объект smartphone, имеющий 5 свойств
var smartphone = {
  "name": "LG G5 se",
  "year": "2016",
  "screen-size": "5.3",
  "screen-resolution": "2560 x 1440",
  "os" : "Android 6.0 (Marshmallow)"
};

// переберём объект smartphone
$.each(smartphone, function( key, value ) {

  // действия, которые будут выполняться для каждого свойства объекта
  // key - текущее имя свойства массива
  // value - значение текущего свойства объекта
 
  // выведем имя свойства и его значение в консоль
  console.log( 'Свойство: ' +key + '; Значение: ' + value );

});

/*
Результат (в консоли):
Свойство: name; Значение: LG G5 se
Свойство: year; Значение: 2016
Свойство: screen-size; Значение: 5.3
Свойство: screen-resolution; Значение: 2560 x 1440
Свойство: os; Значение: Android 6.0 (Marshmallow)
*/

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

Пример №3. В нём осуществим перебор более сложной структуры (рассмотрим, как использовать вложенные each).

// объект, состоящий из 2 свойств. Каждое свойство этого объект имеет в качестве значения массив, элементами которого являются тоже объекты
var articles = {
  "Bootstrap": [
    {"id":"1", "title":"Введение"},
    {"id":"2", "title":"Как установить"},
    {"id":"3", "title":"Сетка"}
  ],
  "JavaScript": [
    {"id":"4", "title":"Основы"},
    {"id":"5", "title":"Выборка элементов"}
  ]  
};

$.each(articles,function(key,data) {
  console.log('Раздел: ' + key);
  $.each(data, function(index,value) {
    console.log('Статья: id = ' + value['id'] + '; Название = '+ value['title']);
  });
});

/*
Результат:
Раздел: Bootstrap
Статья: id = 1; Название = Введение
Статья: id = 2; Название = Как установить
Статья: id = 3; Название = Сетка
Раздел: JavaScript
Статья: id = 4; Название = Основы
Статья: id = 5; Название = Выборка элементов
*/

Как прервать each (выйти из цикла)

Прерывание (break) цикла each осуществляется с помощью оператора return, который должен возвращать значение false.

Например, прервём выполнение цикла each после того как найдём в массиве arr число 7:

// массив, состоящий из 5 чисел
var arr = [5, 4, 7, 17, 19];

// число, которое необходимо найти
var find = 7;

// переберём массив arr
$.each(arr, function (index, value) {
  // если необходимое число найдено, то..
  if (value === find) {
    // вывести его в консоль
    console.log('Ура! Число ' + find + ' найдено! Данное число имеет индекс: ' + index);
    // прервать выполнение цикла
    return false;
  } else {
  // иначе вывести в консоль текущее число
  console.log('Текущее число: ' + value);
  }
});

/* Результат (в консоли):
Текущее число: 5
Текущее число: 4
Ура! Число 7 найдено! Данное число имеет индекс: 2
*/

Как перейти к следующей итерации (each continue)

В each прерывание выполнения текущей итерации и переход к следующей осуществляется с помощью оператора return, который должен иметь значение отличное от false.

// массив, состоящий из чисел
var arr = [3, 5, 4, 9, 17, 19, 30, 35, 40];

// массив, который должен содержать все элементы массива arr, кроме чётных чисел
var newarr = [];

// переберём массив arr
$.each(arr, function (index, value) {

  // если элемент чётный, то пропустим его
  if (value % 2 === 0) {
    // прервём выполнение текущей итерации и перейдём к следующей
    return;
  }
  // добавить в массив newarr значение value
  newarr.push(value);

});

console.log('Исходный массив (arr): ' + arr.join());
console.log('Результирующий массив (newarr): ' + newarr.join());

/* Результат (в консоли):
Исходный массив (arr): 3,5,4,9,17,19,30,35,40
Результирующий массив (newarr): 3,5,9,17,19,35
*/