У меня есть проблема с массивом. Это мой массив:
$servicesTypes = array (
"hotel" => "HTL", "HTP", "HT",
"flight" => "FLT",
"m&a" => "APA",
"daily_tour" => "TOU",
"privat_car" => "PRC",
"transfer" => "4ST");
для каждого «типа», который я отправляю, я пытаюсь получить ключ («гостиница», «рейс» и т. д.)
большую часть времени я получаю это, но для некоторых значений я получаю: «ключ: 0»
На мгновение, если type = «HTP», этот ключ будет равен 0, для ключа «HT» будет «1».
Это почему?
Это мой код:
function get_service_type ($servicesArray, $type)
{
$key = array_search($type, $servicesArray);
echo "key: ".$key;
return $key;
}
Я также попробовал это:
function get_service_type ($servicesArray, $type)
{
foreach($servicesArray as $key => $service)
{
if ( $service == $type )
{
echo "key: ".$key;
return $key;
}
}
return false;
}
Это потому, что в следующей инициализации массива:
$servicesTypes = array (
"hotel" => "HTL", "HTP", "HT",
"flight" => "FLT",
"m&a" => "APA",
"daily_tour" => "TOU",
"privat_car" => "PRC",
"transfer" => "4ST");
Вы присваиваете строковые ключи всем значениям, кроме HTP
а также HT
, Этим пунктам по умолчанию назначаются ключи, которые 0
, 1
, и так далее.
Кажется, вы хотите назначить один и тот же ключ нескольким элементам в PHP. Это не возможно, однако.
РЕДАКТИРОВАТЬ ОП спросил в комментариях ниже, возможно ли присвоить массив значений каждому ключу. Это возможно, но это усложнит функцию поиска.
Т.е. массив такой:
$servicesTypes = array (
"hotel" => array("HTL", "HTP", "HT"),
"flight" => "FLT",
"m&a" => "APA",
"daily_tour" => "TOU",
"privat_car" => "PRC",
"transfer" => "4ST");
в котором значения могут быть строками или массивы, можно найти с помощью get_service_function()
вот так (немного почистил):
function get_service_type ($servicesArray, $type) {
foreach($servicesArray as $key => $service)
if ( is_array($service) ) {
foreach($service as $value)
if($type == $value)
return $key;
} else if ( $service == $type )
return $key;
return false;
}
Что делает вышеуказанная функция:
$servicesArray
$service
это массив:
$service
,$service
это строка:
Вы ошибаетесь по поводу формы вашего массива.
"hotel" => "HTL", "HTP", "HT",
Вы думаете, что это один элемент массива, но на самом деле это 3 элемента (элементы массива разделяются запятыми). Если вы не предоставляете ключ для элемента массива, PHP выбирает ключ для вас, начиная с индекса 0
, затем 1
…
Так что ваши get_service_type()
функция работает как положено.
В ответ на ваш комментарий ниже:
Потому что вы знаете тип (например: HTP
) и вам нужно найти категорию (например: Hotel
), самый простой способ — изменить способ построения массива. Используйте ключи магазина информацию, которую вы знаете. Например:
[
'HTL' => 'hotel',
'HTP' => 'hotel',
'HT' => 'hotel',
'FLT' => 'flight',
'APA' => 'm&a',
...
]
Тогда ваш get_service_type
становится настолько простым, что вам больше не нужна функция:
function get_service_type ($servicesTypes, $type){
return $servicesTypes[$type];
}
Если вам также нужен доступ только к категориям (отель, рейс, м&а …) и вы сформировали массив, как я рекомендую выше, это легко 🙂
$categories = array_unique($servicesTypes);
Вы немного неправильно отформатировали массив, и код изменяется с этим (= [ ]
является эквивалентом = array( )
):
$servicesTypes = [
'hotel' => [
'HTL',
'HTP',
'HT'
],
'flight' => [
'FLT'
],
'm&a' => [
'APA'
],
'daily_tour' => [
'TOU'
],
'private_car' => [
'PRC'
],
'transfer' => [
'4ST'
],
];
function get_service_type ($servicesArray, $type)
{
foreach($servicesArray as $key => $services)
{
foreach ($services as $service)
{
if ($service == $type)
{
return $key;
}
}
}
return false;
}
echo get_service_type($servicesTypes, 'HT');
$servicesTypes = array (
"hotel" => array("HTL", "HTP", "HT"),
"flight" => "FLT",
"m&a" => "APA",
"daily_tour" => "TOU",
"privat_car" => "PRC",
"transfer" => "4ST");
функция get_service_type ($ servicesArray, $ type)
{
foreach($servicesArray as $key => $service)
{
if(is_array($service))
{
if(in_array($type,$service))
return $key;
}else
{
if ( $service == $type )
{
echo "key: ".$key;
return $key;
}
}
}
вернуть ложь;
}