@ALsv32

Как найти в массиве ответа API нужное значение, при том что значение может быть написано в разном регистре?

ТК "Энергия". Запрос на этот адрес (нужен доступ) отдаёт весь ассоциативный массив городов и складов компании "cityList" такого типа:
[3071] => Array
                (
                    [id] => 500009310
                    [name] => Новочеркасск
                    [idCountry] => 86015311036992
                    [isRegionalDelivery] => 
                    [parentId] => -1
                    [description] => РОСТОВСКАЯ ОБЛАСТЬ
                    [type] => 1
                    [defaultIdWare] => 0
                    [warehouses] => Array
В ответе делаю поиск совпадения по ключу [name] чтобы получить значение [id] для последующей работы с ним.
$array = ($obj["cityList"]);
$index=array();
foreach($array as $k => $v)
{
 $index[$v['name']]=$k;
}
$cityid = $array[$index[$name]]["id"];
В качестве искомого значения всегда выступает название населённого пункта. Это название всегда пишется с большой буквы. Всё работает так как нужно ровно до того момента, пока не столкнёшься вот с таким значением в ответе: (искомое слово "Нефтеюганск")
[2801] => Array
                (
                    [id] => 500025228
                    [name] => НефтеЮГАНСК
                    [idCountry] => 86015311036992
                    [isRegionalDelivery] => 
                    [parentId] => -1
                    [description] => Ханты-Мансийский автономный округ
                    [type] => 1
                    [defaultIdWare] => 0
                    [warehouses] => Array

Или вот с таким значением в ответе: (искомое слово "Красноярск")
[2034] => Array
                (
                    [id] => 3912
                    [name] => КрасноЯРСК
                    [idCountry] => 86015311036992
                    [isRegionalDelivery] => 
                    [parentId] => -1
                    [description] => Красноярский край
                    [type] => 1
                    [defaultIdWare] => 20545
                    [warehouses] => Array
.
Можно ли как-то находить нужное значением без привязки к регистру букв? Чтобы при таких "странных" записанных значениях всё равно поиск заканчивался удачно?
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Adamos
@Adamos
Недавно, делая импорт с такими же проблемами, просто написал пару функций и применял их к каждому такому полю:
private function makeLowIdList($array)
    {
        return array_flip(array_map(fn($value) => mb_convert_case($value, MB_CASE_LOWER), $array));
    }

    private function getId($idList, $title, $label)
    {
        $lowTitle = mb_convert_case($title, MB_CASE_LOWER);
        if(!array_key_exists($lowTitle, $idList)) {
            throw new Exception('wrong ' . $label . ': ' . $title);
        }
        return $idList[$lowTitle];
    }

    public function import($data) 
    {
        $payerIds = $this->makeLowIdList(Payer::getTitles());
        foreach(...) {
            try {
                    ...
                    $payerId = $this->getId($payerIds, $row['payer'], $row['orderNumber'] . ' payer');
                    ...
            } catch(Exception $e) {
                $error = $e->getMessage();
                if(!in_array($error, $errors)) {
                    $errors[] = $error;
                }
            }
        }
        return $errors;
    }
Ответ написан
Комментировать
402d
@402d
начинал с бейсика на УКНЦ в 1988
Имхо этот ответ апи условно постоянный.
То есть допустимо закешировать на сутки.
Вместо того, чтобы каждый раз искать перебором,
я бы закешировал уже готовый массив.
ключ_все_буквы_в_нижнем_регистре => id
include "cashe.php";
return $cities[$key];
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы