Сделайте ключи массива нечувствительными в php - PullRequest
2 голосов
/ 29 июня 2011

Я использую DB2 с моим PHP.DB2 возвращает все имена столбцов в верхнем регистре.Если я использую db2_fetch_assoc, то результат будет примерно таким:

Array { [USERID] => 4 }

Но в моем php-файле значения массива, назначенные как это, и его в camelstyle

$this->userId = $row['userId'];

, поэтому он выдаетошибка Error : Undefined index userId

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

Невозможно изменить все мои файлы.Также его Linux-машина.

Так есть ли в php какая-либо функция для отключения чувствительности к регистру ключей массива.

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

Вы можете расширить ArrayObject с SPL .Таким образом, по крайней мере, вам нужно только «коснуться» функций / методов, которые получают данные из базы данных.

$row = getRow();
echo $row['userId'];

function getRow() {
    $row = array ( 'USERID' => 4, 'FOO'=>123, 'BAR'=>456 );
    return new UCArrayObject($row);
}

class UCArrayObject extends ArrayObject
{
    public function offsetExists ($index) { return parent::offsetExists(strtoupper($index)); }
    public function offsetGet($index) { return parent::offsetGet(strtoupper($index)); }
    public function offsetSet ($index, $newval) { parent::offsetSet(strtoupper($index), $newval); }
    public function offsetUnset ($index) { parent::offsetUnset(strtoupper($index)); }
}
1 голос
/ 29 июня 2011

Я не знаю о DB2, но большинство библиотек будут возвращать строки в том случае, если вы укажете их в своем запросе, поэтому вы можете SELECT USERID, SELECT userid или SELECT UserId, в зависимости от того, что вам больше подходит.

Ключи массива никогда не чувствительны к регистру.

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

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

Другое решение: если у вас довольно маленькийКоличество запросов, и ваш слой базы данных хорошо отделен от остальной части вашего приложения, вы можете применить какой-то перевод.Просто выполните итерацию по полученным массивам и сопоставьте их ключи с конкретным корпусом, который вам нравится, используя массив перевода.Например, создайте массив, содержащий ('lowercase' => 'CamelCase') версии имен ваших полей.Таким образом, вы можете легко найти имена и найти подходящий для них корпус.Используя найденные ключи, вы можете создать новый массив, прежде чем вернуть его запрашивающему коду.

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

0 голосов
/ 29 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...