Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Поиск в трехмерном массиве

ICaR Soft Эксперт пока не указал должность 9 месяцев назад
имею массив (на деле там 50-60 нас.пунктов):
 $city_info = array(  
"Зарубинск" => array(
'tel_code' => '4951',
'coordinat' => '36.4554;17.5644'
),
"Убивайлово"=> array(
'tel_code' => '4952',
'coordinat' => '174.4554;86.5644'
),
"Малые Трупняки"=> array(
'tel_code' => '4953',
'coordinat' => '56.4554;36.5644'
)
);
С двумерным всё ясно и просто ыбло. Но как вот с таким работать?
По клику приходит у меня код города
По итогу я должен словить от кода - название нас.пункта и его координаты.
Получается в теории делать по каждой строке поиск?
1. Зашёл в мини-массив (двумерный), поискал - не нашёл = вышел?
2. Зашёл в следующий. Поискал - нашёл = прервать пиоск?
------
Не могу что-то примера аналогичного найти.
Голосование за лучший ответ
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (263814) 10 месяцев назад
Где твой алгоритм.. что ты ищешь-то
 $city_info = array(   
"Зарубинск" => array(
'tel_code' => '4951',
'coordinat' => '36.4554;17.5644'
),
"Убивайлово"=> array(
'tel_code' => '4952',
'coordinat' => '174.4554;86.5644'
),
"Малые Трупняки"=> array(
'tel_code' => '4953',
'coordinat' => '56.4554;36.5644'
)
);

function findCityByCode($code) {
global $city_info;

foreach ($city_info as $city => $data) {
if ($data['tel_code'] == $code) {
return array(
'city' => $city,
'coordinates' => $data['coordinat']
);
}
}

return null; // Если город не найден
}

// Пример использования
$tel_code_to_find = '4952';
$result = findCityByCode($tel_code_to_find);

if ($result) {
echo "Город: " . $result['city'] . "
";
echo "Координаты: " . $result['coordinates'] . "
";
} else {
echo "Город не найден.";
}
?>
ICaR SoftГуру (3137) 10 месяцев назад
Я представлял трехмерный массив как куб данных, хотел уже делать поиск по "слоям" у меня их там 40-50 этих слоёв.
Спасибо. Сейчас буду пробовать.
ICaR SoftГуру (3137) 10 месяцев назад
Хотел простым "array_search" обойтись.
V̲i̲s̲t̲a̲s̲t̲e̲r̲Искусственный Интеллект (263814) 10 месяцев назад
нет , он работает с одномерками.. но можно сделать
ICaR Soft Гуру (3137) V̲i̲s̲t̲a̲s̲t̲e̲r̲, Ресурс прогноза-погоды пишу по городам региона. Аналогично этому - Krasnovosti.ru
ICaR SoftГуру (3137) 10 месяцев назад
Сработало!
Через БД (MySQL) раньше такое делал. Тут решил мозг на старости лет потренировать.
Решил без БД делать.
Огромное спасибо! Функции слабовато умею писать, так как самоучка.
Oleg D. Искусственный Интеллект (110741) 10 месяцев назад
к примеру так
array_filter($city_info, fn($info, $city) => $info['tel_code'] == $search, ARRAY_FILTER_USE_BOTH);

но если у вас всегда поиск происходит по коду города - то его и вынесите в ключи, потом просто return $city_info[$search]
ICaR SoftГуру (3137) 10 месяцев назад
Так и думал, что массив организовал некорректно.
Первый мой опыт разработки через массив вместо базы на MySQL.
Oleg D. Искусственный Интеллект (110741) Opinion, да нет, вполне себе рабочий вариант и скорее вопрос личных предпочтений и удобства. если поиск _всегда_ по коду города происходит - тогда да, логично его в ключи вынести, иначе вариантов может быть много.
ICaR SoftГуру (3137) 10 месяцев назад
Некоторые понимания об ООП в голове играло. Дескать [имя_нас.пункта], а у него уже параметры: код, координаты и т.п..
Oleg D. Искусственный Интеллект (110741) Opinion, тут скорее о бд нужно думать) если бы я делал что-то подобное массивом - то без ключей их оставил, пусть сами нумеруются. а для поиска генерировал бы из этого массива варианты с нужными для поиска ключами. ну и кэшировать их. но это уже почти бд получается.
Сергей Стодольский Мастер (1212) 10 месяцев назад
 $city_info = array( 
"Зарубинск" => array(
'tel_code' => '4951',
'coordinat' => '36.4554;17.5644'
),
"Убивайлово"=> array(
'tel_code' => '4952',
'coordinat' => '174.4554;86.5644'
),
"Малые Трупняки"=> array(
'tel_code' => '4953',
'coordinat' => '56.4554;36.5644'
)
);

function searchByCode($code, $data) {
$index = array_search($code, array_column($data, 'tel_code'));
$key = array_keys($data)[$index];
return $data[$key];
}
$result = searchByCode(4953, $city_info);
echo var_dump($result);
print_r($result, false);
ну или так
а по хорошему ключами в массиве должны быть коды...
ICaR SoftГуру (3137) 10 месяцев назад
Так и думал, что массив организовал некорректно.
Первый мой опыт разработки через массив вместо базы на MySQL.
ICaR SoftГуру (3137) 10 месяцев назад
Некоторые понимания об ООП в голове играло. Дескать [имя_нас.пункта], а у него уже параметры: код, координаты и т.п..
step Мастер (1313) 10 месяцев назад
ну так если на входе код города, то пусть он и будет индексом верхнего уровня. во-первых поиск быстрее, во-вторых названия населенных пунктов может совпадать, а вот код - нет. изначально плохо разработанная структура хранения информации может родить гемор на года.
ICaR SoftГуру (3137) 10 месяцев назад
Так и думал, что массив организовал некорректно.
Первый мой опыт разработки через массив вместо базы на MySQL.
ICaR SoftГуру (3137) 10 месяцев назад
Некоторые понимания об ООП в голове играло. Дескать [имя_нас.пункта], а у него уже параметры: код, координаты и т.п..
stepМастер (1313) 10 месяцев назад
если индекс цифра, поиск идет быстрее, чем строка. поэтому всегда предпочтительней код(даж если массив вместо базы). индекс должен быть уникальным, иначе до конца проекта будешь городить кастыли.
Похожие вопросы