Php найти элемент в массиве значению. PHP array_search: поиск значения в массиве. Синтаксис PHP и окружение языка

Программирование - это синтаксис и семантика. Первое определяется правилами языка, второе - опытом разработчика. В отношении массивов разработчик может предметно нагрузить синтаксис семантикой. Это еще не объект, но уже не массив в традиционном понимании. PHP дает возможность создавать массивы из переменных различных типов, включая самих себя. Элементом массива может быть функция, то есть возможность нагрузить массив реальным алгоритмом, реальным смыслом.

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

Конструирование массивов

Массив в PHP имеет удобный синтаксис и функциональность. Этот можно описать предварительно, но часто удобно создавать массивы на лету по мере необходимости.

public $aNone = array(); // массив описан и ничего не содержит

public $aFact = array("авокадо", "персик", "вишня"); // в этом массиве три элемента

Создание массива в процессе проверки какого-либо условия:

$cSrcLine = "строка анализируемых данных";

for ($i=0; $i<13; $i++) {

if (checkFunc($cSrcLine, $cUserLine) {

$aResult = "Yes"; // добавить в массив PHP

$aResult = "No";

В результате исполнения данного примера создастся массив из 13 элементов, значениями которого будут только строки "Yes" или "No". Элементы получат индексы от 0 до 12. Тот же эффект можно получить, предварительно записав "будущий" PHP-массив в строку:

$cFutureArray = "";

for ($i=0; $i<13; $i++) {

$cUserLine = inputUserLine(); // ввод чего-то

if ($i > 0) { $cFutureArray .= "|"; }

if (checkFunc($cSrcLine, $cUserLine) { $cFutureArray .= "Yes";

} else { $cFutureArray .= "No"; }

$aResult = explode("|", $cFutureArray);

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

Многие системы управления сайтами (СМС) используют массивы «с размахом». С одной стороны, это хорошая практика, с другой стороны, это затрудняет применение. Даже если автору понятна доктрина "PHP-массив в массиве", то не следует ей злоупотреблять: не только разработчику придется привыкать к сложной нотации. Часто спустя время сам создатель будет долго вспоминать, что писал поначалу:

"view_manager" => array(41, "template_path_stack" => array(__DIR__ . "/../view",),

"router" => array("routes" => array("sayhello" => array(

"type" => "Zend\Mvc\Router\Http\Literal",

"options" => array("route" => "/sayhello", "defaults" => array(

"controller" => "Helloworld\Controller\Index", "action" => "index",))))),

"controllers" => array("invokables" => array(

"Helloworld\Controller\Index" => "Helloworld\Controller\IndexController"))

Это образец практики «PHP-массив в массиве» от ZF 2. Не слишком вдохновляет поначалу, но это работает и, возможно, делает данный фреймворк успешным (пример из модуля ZendSkeletonApplication/module/Helloworld/config/module.config.php).

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

Просто, доступно и понятно

Создавая на php массив в массиве, лучше всего ограничиваться двумя-тремя уровнями. Несмотря на стабильность и надежность PHP допускает ошибки при обработке синтаксических конструкций. С этим мириться можно, имея хороший редактор кода, привыкнув точно считать скобки и запятые. Однако PHP не контролирует типы данных (это карма современного программирования) и позволяет разработчику практиковать семантические ошибки.

Правило контролировать типы переменных или собственные идеи превращения семантики в синтаксис - часто непозволительная роскошь. Это потеря скорости скрипта, читабельности кода, ... потому простота в кодировании всегда имеет существенное значение.

У PHP есть существенная отрицательная черта: при возникновении неопределенности скрипт просто зависает. Не все отладчики справляются с непредвиденными обстоятельствами, и многое зависит от опыта и интуиции разработчика. Чем проще алгоритм, чем доступнее структурирована информация, тем больше шансов найти ошибку или вовсе не допустить ее.

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

Простые и ассоциативные массивы

Запись двумерного массива - это еще одна пара скобок "[" и "]", например: $aSrcData означает обращение к элементу массива , входящего в массив $aSrcData. В PHP нет требования объявлять заранее данные. Любою заявленную информацию всегда можно проверить на предмет существования.

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

$aAnketa["name"] = "Иванов";
$aAnketa["age"] = 42;
$aAnketa["work"] = "Директор";
$aAnketa["active"] = true;
$aTable = $aAnketa;

$aAnketa["name"] = "Петров";
$aAnketa["age"] = 34;
$aAnketa["work"] = "Менеджер";
$aAnketa["active"] = true;
$aTable = $aAnketa;

$aAnketa["name"] = "Афанасьев";
$aAnketa["age"] = 28;
$aAnketa["work"] = "Рабочий";
$aAnketa["active"] = false;
$aTable = $aAnketa;

$sOne .= implode ("; ", $aTable) . "
"; // второй PHP-массив в строку
$sOne .= $aTable["work"]; // обращение к одному элементу второго массива

Результат работы этого примера (первый массив - обычный, ключи в нем начинаются с 0, второй массив - ассоциативный, в нем четыре ключа: "name", "age", "work", "active"):

$sOne = "Петров; 34; Менеджер; 1
Менеджер";

На этом простом примере можно видеть, как созданная анкета может быть применена ко всем сотрудникам. Можно создать массив сотрудников с индексами по табельным номерам и, если нужен будет конкретный сотрудник, то выбрать его по табельному номеру.

Если в организации есть подразделения, или есть сезонные рабочие, или требуется отдельно выделить работающих пенсионеров, ... конструкция "PHP-массив в массиве" очень удобна, но никогда не следует увлекаться размерностью. Два-три измерения - предел для эффективного решения.

Ключи для работы с массивами

Если раньше имело значение, как все устроено, то в последние годы традиции бинарной эпохи, когда программист хотел знать, как именно хранятся элементы массива, и желал иметь к ним прямой доступ, забылись окончательно. Появилось много кодировок символов, которые занимают в памяти далеко не один байт. Слово "бит" можно встретить теперь разве что в операциях битового поиска, но поиск в массиве PHP - это отдельная тема. Доступ к элементам может быть простым и ассоциативным. В первом случае элементы массива (имеющие любой из доступных в PHP типов) нумеруются 0, 1, 2, ... Во втором случае программист указывает собственный индекс, именуемый чаще "ключ" для доступа к нужному значению.

$aLine["фрукт"] = "апельсин"; // здесь PHP-ключ массива = "фрукт"

или (чтобы все было корректно с соблюдением кодировки страницы и кода):

$aLine = iconv ("UTF-8", "CP1251", "апельсин");

При добавлении к массиву $aLine нового значения:

$aLine = iconv ("UTF-8", "CP1251", "персик");
$aLine = iconv ("UTF-8", "CP1251", "огурец");
$aLine = iconv ("UTF-8", "CP1251", "баклажан");

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

foreach ($aLine as $ck => $cv) {
$cOne .= $ck . "=" . $cv . "
";
}

будет получено:

фрукт=апельсин
0=персик
овощ=огурец
1=баклажан

PHP-ключ массива при добавлении элементов "персик" и "баклажан" формируется последовательно от 0, а при указании его значения будет равен этому значению.

Удаление элементов из массива

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

Можно поступить проще. Если к последнему примеру применить:

unset($aLine); // удалить элемент массива PHP

то результат будет:

фрукт=апельсин
овощ=огурец
1=баклажан

Вариантов манипулирования элементами массивов можно сконструировать множество. Например, используя функции: implode() и explode(), можно записать PHP-массив в строку с одним разделителем, а разобрать обратно в другой массив - по другому разделителю.

Чтобы просто на PHP удалить массив целиком, достаточно написать: unset($aLine);

Этого достаточно.

Поиск в массиве

PHP содержит специальные функции поиска и in_array(), однако прежде чем решить их использовать, следует рассмотреть возможность выполнить поиск в массиве PHP собственными силами.

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

В PHP можно вызывать функции, имя которых определяется в ходе исполнения программы. Очень практичный пример из библиотеки PHPWord, которая позволяет читать и создавать документы MS Word:

$elements = array("Text", "Inline", "TextRun", "Link", "PreserveText", "TextBreak",
"ListItem", "ListItemRun", "Table", "Image", "Object", "Footnote",
"Endnote", "CheckBox", "TextBox", "Field", "Line");

$functions = array();

for ($i = 0; $i < count($elements); $i++) {
$functions[$i] = "add" . $elements[$i];
}

В результате массив $functions получит значения массива $elements, то есть имена реальных функций, которые выполняют работу с реальными элементами документа.

Вызывая для $elements функцию $functions, можно получить идеальный поиск и быстрый результат.

Сортировка элементов

Задача сортировки данных имеет важное значение, и PHP предлагает несколько функций для этого: sort(), rsort(), asort(), ksort(), ... По возрастанию и по убыванию элементов вторые две функции сохраняют отношения между ключами и значениями. Иногда имеет смысл перемешать значения массива случайным образом - shuffle().

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

Лучший способ написать самостоятельно идеальное решение, во всяком случае на этапе тестирования скрипта, - это ручная сортировка. Она поможет предусмотреть непредвиденные ситуации.

Строчные массивы

Благодаря функциям implode() и explode() массив можно легко трансформировать в строку и получить обратно. Это позволяет хранить данные в компактном представлении и разворачивать их в удобное состояние по мере надобности.

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

$cSrcLine = "Text Text ListItemRun TextBox ListItem TextBox Check Box CheckBox TextBox Footnote";

$aSrc = explode(" ", $cSrcLine);
$cDstLine = "";

for ($i=0; $i < count($aSrc); $i++) {
$cFind = "[" . $aSrc[$i] . "]";
if (! is_integer(strpos($cDstLine, $cFind))) {
$cDstLine .= $cFind;
}
}
$aDst = explode("][", $cDstLine);

$cOne = implode("; ", $aDst);

В результате переменная $cOne получит только те значения из исходной строки, которые там встречаются по одному разу: "Text; ListItemRun; TextBox; ListItem; Check; Box; CheckBox; Footnote".

Русский язык в ключах и значениях

Не рекомендуется использовать ничего, что связано с национальными кодировками, в синтаксических конструкциях. Русский язык, как и все прочие языки, символы которых выходят за пределы a-z, не будет создавать проблем, находясь в области данных, но не в синтаксисе кода. Иногда даже простая задача на PHP «вывести массив на принтер или на экран» приведет к "кракозябрам", а чаще просто остановит скрипт.

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

Синтаксис PHP и окружение языка

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

Правило «в коде есть только код, а на входе, внутри, и на выходе есть всякая информация» поможет избежать непредвиденных неожиданностей. PHP-значение в массиве может быть «русским», но ключ на него должен быть синтаксически корректным не только с позиций данного языка, но и с позиций среды его работы.

из многомерном (18)

Я изменил один из примеров ниже описание функции array_search . Функция searchItemsByKey возвращает все значения по $ key из многомерного массива (N уровней). Возможно, это было бы полезно для кого-то. Пример:

$arr = array("XXX"=>array("YYY"=> array("AAA"=> array("keyN" =>"value1")), "ZZZ"=> array("BBB"=> array("keyN" => "value2")) //.....)); $result = searchItemsByKey($arr,"keyN"); print "

";
print_r($result);
print "
";
// OUTPUT
Array
( => value1
 => value2)
 

Код функции:

Function searchItemsByKey($array, $key) { $results = array(); if (is_array($array)) { if (isset($array[$key]) && key($array)==$key) $results = $array[$key]; foreach ($array as $sub_array) $results = array_merge($results, searchItemsByKey($sub_array, $key)); } return $results; }

У меня есть массив, где я хочу искать uid и получить ключ от массива.

Примеры

Предположим, что мы имеем следующий двумерный массив:

$userdb = array(array("uid" => "100", "name" => "Sandra Shush", "pic_square" => "urlof100"), array("uid" => "5465", "name" => "Stefanie Mcmohn", "pic_square" => "urlof100"), array("uid" => "40489", "name" => "Michael", "pic_square" => "urlof40489"));

Вызов функции search_by_uid(100) (uid первого пользователя) должен вернуть 0 .

Вызов функции search_by_uid(40489) должен возвращать 2 .

Я пробовал создавать циклы, но мне нужен более быстрый исполняемый код.

Исходя из превосходного ответа Якуба, вот более обобщенный поиск, который позволит указать ключ (а не только для uid):

Function searcharray($value, $key, $array) { foreach ($array as $k => $val) { if ($val[$key] == $value) { return $k; } } return null; }

Использование: $results = searcharray("searchvalue", searchkey, $array);

Function searchForId($id, $array) { foreach ($array as $key => $val) { if ($val["uid"] === $id) { return $key; } } return null; }

Это сработает. Вы должны называть это следующим образом:

$id = searchForId("100", $userdb);

Важно знать, что если вы используете === сравниваемые типы операторов должны быть точно такими же, в этом примере вам нужно искать string или просто использовать == вместо === .

На основании ответа angoru . В более поздних версиях PHP (>= 5.5.0) вы можете использовать однострочный.

$key = array_search("100", array_column($userdb, "uid"));

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

Function searchArrayKeyVal($sKey, $id, $array) { foreach ($array as $key => $val) { if ($val[$sKey] == $id) { return $key; } } return false; }

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

// Array Data Of Users $userdb = array (array ("uid" => "100","name" => "Sandra Shush","url" => "urlof100"), array ("uid" => "5465","name" => "Stefanie Mcmohn","url" => "urlof100"), array ("uid" => "40489","name" => "Michael","url" => "urlof40489"),); // Obtain The Key Of The Array $arrayKey = searchArrayKeyVal("uid", "100", $userdb); if ($arrayKey!==false) { echo "Search Result: ", $userdb[$arrayKey]["name"]; } else { echo "Search Result can not be found"; }

If(! function_exists("arraySearchMulti")){ function arraySearchMulti($search,$key,$array,$returnKey=false) { foreach ($array as $k => $val) { if (isset($val[$key])) { if ((string)$val[$key] == (string)$search) { return ($returnKey ? $k: $val); } }else{ return (is_array($val) ? arraySearchMulti($search,$key,$val,$returnKey) : null); } } return null; }}

вы можете использовать эту функцию; https://github.com/serhatozles/ArrayAdvancedSearch

="2""; $Array = array("a" => array("d" => "2"), array("a" => "Example World","b" => "2"), array("c" => "3"), array("d" => "4"),); $Result = ArraySearch($Array,$query,1); echo "

";
print_r($Result);
echo "
"; // Output: // Array // (// => Array // (// [a] => Example World // [b] => 2 //) // //)

Если вопрос, т.е.

$a = [ [ "_id" => "5a96933414d48831a41901f2", "discount_amount" => 3.29, "discount_id" => "5a92656a14d488570c2c44a2", ], [ "_id" => "5a9790fd14d48879cf16a9e8", "discount_amount" => 4.53, "discount_id" => "5a9265b914d488548513b122", ], [ "_id" => "5a98083614d488191304b6c3", "discount_amount" => 15.24, "discount_id" => "5a92806a14d48858ff5c2ec3", ], [ "_id" => "5a982a4914d48824721eafe3", "discount_amount" => 45.74, "discount_id" => "5a928ce414d488609e73b443", ], [ "_id" => "5a982a4914d48824721eafe55", "discount_amount" => 10.26, "discount_id" => "5a928ce414d488609e73b443", ], ];

Function searchForId($id, $array) { $did=0; $dia=0; foreach ($array as $key => $val) { if ($val["discount_id"] === $id) { $dia +=$val["discount_amount"]; $did++; } } if($dia != "") { echo $dia; var_dump($did); } return null; }; print_r(searchForId("5a928ce414d488609e73b443",$a));

Попробуйте это также

Function search_in_array($srchvalue, $array) { if (is_array($array) && count($array) > 0) { $foundkey = array_search($srchvalue, $array); if ($foundkey === FALSE) { foreach ($array as $key => $value) { if (is_array($value) && count($value) > 0) { $foundkey = search_in_array($srchvalue, $value); if ($foundkey != FALSE) return $foundkey; } } } else return $foundkey; } }

$a = ["x" => ["eee", "ccc"], "b" => ["zzz"]]; $found = null; $search = "eee"; array_walk($a, function ($k, $v) use ($search, &$found) { if (in_array($search, $k)) { $found = $v; } }); var_dump($found);

Вот один лайнер для того же,

$pic_square = $userdb["pic_square"];

Вот мой пример и, пожалуйста, обратите внимание, что это мой первый ответ. Я достал массив param, потому что мне нужно было искать только один конкретный массив, но вы могли бы легко добавить его. Я хотел по существу искать больше, чем просто uid.

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

/** * @param array multidimensional * @param string value to search for, ie a specific field name like name_first * @param string associative key to find it in, ie field_name * * @return array keys. */ function search_revisions($dataArray, $search_value, $key_to_search) { // This function will search the revisions for a certain value // related to the associative key you are looking for. $keys = array(); foreach ($dataArray as $key => $cur_value) { if ($cur_value[$key_to_search] == $search_value) { $keys = $key; } } return $keys; }

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

В этом втором примере показано, где значение («Тейлор») найдено в определенном ассоциативном ключе (first_name). И другое значение (true) найдено в другом ассоциативном ключе (используется) и возвращает все соответствия (Ключи, в которых люди с именем «Тейлор» И используются).

/** * @param array multidimensional * @param string $search_value The value to search for, ie a specific "Taylor" * @param string $key_to_search The associative key to find it in, ie first_name * @param string $other_matching_key The associative key to find in the matches for employed * @param string $other_matching_value The value to find in that matching associative key, ie true * * @return array keys, ie all the people with the first name "Taylor" that are employed. */ function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) { // This function will search the revisions for a certain value // related to the associative key you are looking for. $keys = array(); foreach ($dataArray as $key => $cur_value) { if ($cur_value[$key_to_search] == $search_value) { if (isset($other_matching_key) && isset($other_matching_value)) { if ($cur_value[$other_matching_key] == $other_matching_value) { $keys = $key; } } else { // I must keep in mind that some searches may have multiple // matches and others would not, so leave it open with no continues. $keys = $key; } } } return $keys; }

Использование функции

$data = array(array("cust_group" => 6, "price" => 13.21, "price_qty" => 5), array("cust_group" => 8, "price" => 15.25, "price_qty" => 4), array("cust_group" => 8, "price" => 12.75, "price_qty" => 10)); $findKey = search_revisions($data,"8", "cust_group", "10", "price_qty"); print_r($findKey);

Результат

Array ( => 2)

/** * searches a simple as well as multi dimension array * @param type $needle * @param type $haystack * @return boolean */ public static function in_array_multi($needle, $haystack){ $needle = trim($needle); if(!is_array($haystack)) return False; foreach($haystack as $key=>$value){ if(is_array($value)){ if(self::in_array_multi($needle, $value)) return True; else self::in_array_multi($needle, $value); } else if(trim($value) === trim($needle)){//visibility fix// error_log("$value === $needle setting visibility to 1 hidden"); return True; } } return False; }

Если вы используете (PHP 5> = 5.5.0), вам не нужно писать свою собственную функцию для этого, просто напишите эту строку, и все будет готово.

Если вы хотите получить только один результат:

$key = array_search(40489, array_column($userdb, "uid"));

Для нескольких результатов

$keys = array_keys(array_column($userdb, "uid"), 40489);

Если у вас есть ассоциативный массив, как указано в комментариях, вы можете сделать это с помощью:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, "uid")),40489);

Если вы используете PHP <5.5.0, вы можете использовать этот backport , спасибо ramsey!

Обновление. Я делаю несколько простых тестов, и форма с несколькими результатами, кажется, самая быстрая, даже быстрее, чем пользовательская функция Jakub!

В более поздних версиях PHP (> = 5.5.0) вы можете использовать этот однострочный:

$key = array_search("100", array_column($userdb, "uid"));

Развернув на созданную функцию @mayhem, этот пример будет скорее «нечетким» поиском, если вы просто захотите сопоставить часть (большую часть) строки поиска:

Function searchArrayKeyVal($sKey, $id, $array) { foreach ($array as $key => $val) { if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) { return $key; } } return false; }

Например, значение в массиве - Добро пожаловать в Нью-Йорк! и вам нужен первый экземпляр только «Нью-Йорк!».

Мне пришлось использовать функцию un, которая находит все элементы в массиве. Поэтому я изменил функцию, выполняемую Якубом Трунечком следующим образом:

Function search_in_array_r($needle, $array) { $found = array(); foreach ($array as $key => $val) { if ($val == $needle) { array_push($found, $val); } } if (count($found) != 0) return $found; else return null; }

$search1 = "demo"; $search2 = "bob"; $arr = array("0" => "hello","1" => "test","2" => "john","3" => array("0" => "martin", "1" => "bob"),"4" => "demo"); foreach ($arr as $value) { if (is_array($value)) { if (in_array($search2, $value)) { echo "successsfully"; //execute your code } } else { if ($value == $search1) { echo "success"; } } }

Если возможно, введите типы параметров. Но он работает только с простыми типами, такими как int, bool и float.

$unsafe_variable = $_POST["user_id"]; $safe_variable = (int)$unsafe_variable ; mysqli_query($conn, "INSERT INTO table (column) VALUES ("" . $safe_variable . "")");

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

Функции для поиска в массиве :
array_search — служит для поиска значения в массиве. В случае удачи она возвращает ключ искомого значения, если ничего не найдено — возвращает FALSE. До версии PHP 4.2.0, array_search() при неудаче возвращала NULL, а не FALSE.

Синтаксис функции mixed array_search (mixed needle, array haystack [, bool strict]).

foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement

Пример использования функции с конструкцией foreach для поиска элемента массива, возвращает TRUE при успехе

Синтаксис конструкции
while (expr)
statement

Возвращает ключ элемента массива при успехе

Из приведенной таблицы замеров видно, что функция array_search , показывает наилучший результат как при поиске в малых так и больших массивах. При этом время поиска спомощью циклов значительно увеличивается в зависимости от размера массива.

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

Синтаксис

Формализованное описание функции array_search() в PHP выглядит следующим образом:

Mixed array_search (mixed value, array $collection [, bool strict])

Входные параметры:

  • $collection - массив, в котором будет произведен поиск;
  • value - искомое значение любого типа;
  • strict - необязательный логический флаг, устанавливающий строгий механизм сравнения с учетом типов.

Механизм работы

Функция PHP array_search() поочередно сравнивает value со всеми значениями в массиве collection. По умолчанию, сравнение осуществляется без учета типов операндов. Эту настройку можно изменить, установив для флага strict значение TRUE. Сравнение строк осуществляется с учетом регистра.

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

Если совпадений не найдено, функция вернет булево значение FALSE.

Проверять возвращенный результат следует с помощью оператора строгого равенства (===). Это важно, так как функция может вернуть значение, которое приводится к FALSE, например, 0 или пустую строку.

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

Пример 1. При передаче в функцию PHP array_search() многомерного массива, результатом работы будет ключ искомого элемента.

"winter", "season2" => "spring", "season3" => "summer", "season4" => "autumn"); $result1 = array_search("winter", $array); $result2 = array_search("summer", $array); $result3 = array_search("april", $array); ?>

В этом примере переменная $result1 получит значение "season1", $result2 будет равна "season3", а $result3 будет присвоено булево значение FALSE, так как строка "april" не встречается в исходном массиве.

Пример 2. Функция PHP array_search() может обрабатывать и одномерный массив, считая его ключи следующими по порядку числовыми индексами.

Переменной $result будет присвоено значение 1, согласно индексу элемента "охотник" в массиве $array.

Пример 3. Возможная ошибка при анализе результата.

"Washington", 1 => "Adams", 2 => "Jefferson", 3 => "Madison", 4 => "Monroe"); $result = array_search("Washington", $presidents); if (!$result) { echo "G. Washington was not the first president of the USA"; } ?>

Вот так, не проверяя полученный результат строгим равенством, можно получить неожиданное сообщение о том, что Джордж Вашингтон не был первым президентом Соединенных Штатов.

Пример 4. Возвращается только ключ первого обнаруженного совпадения.

Несмотря на то, что искомое значение встречается в массиве трижды, функция вернет только первый найденный результат - 0. Для поиска множественных совпадений рекомендуется использовать функцию PHP array_keys().

(PHP 4 >= 4.0.5, PHP 5)

array_search -- Осуществляет поиск данного значения в массиве и возвращает соответствующий ключ в случае удачи

Описание

mixed array_search (mixed needle, array haystack [, bool strict])

Ищет в haystack значение needle и возвращает ключ, если таковое присутствует в массиве, FALSE в противном случае.

Замечание: Если needle является строкой, производится регистро-зависимое сравнение.

Замечание: До PHP 4.2.0, array_search() при неудаче возвращала NULL вместо FALSE .

Если вы передадите значение TRUE в качестве необязательного третьего параметра strict , функция array_search() также проверит тип needle в массиве haystack .

Если needle присутствует в haystack более одного раза, будет возвращён первый найденный ключ. Для того, чтобы возвратить ключи для всех найденных значений, используйте функцию array_keys() с необязательным параметром search_value .


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

$array = array(0 => "blue" , 1 => "red" , 2 => 0x000000 , 3 => "green" , 4 => "red" );$key = array_search ("red" , $array ); // $key = 1;
$key = array_search ("green" , $array ); // $key = 2; (0x000000 == 0 == "green")
$key = array_search ("green" , $array , true ); // $key = 3;
?>
Внимание

Эта функция может возвращать как логическое значение FALSE , так и не относящееся к логическому типу значение, которое приводится к FALSE , например, 0 или "". За более подробной информации обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией.

В продолжение темы:
Операционные системы

Ниже перечислены основные объекты 1С, которые используются при работе с управляемыми формами. Даны краткие примеры кода, демонстрирующие традиционное использование данных...

Новые статьи
/
Популярные