Регистро независимые ключи в массивах. Реально ли?

I_one

Guest
Регистро независимые ключи в массивах. Реально ли?

Не секрет что $arr["foo"] и $arr["FOO"] в общем случае не равны друг другу из за разного значения ключа. Реально ли как нить сконфигурить php что бы ключи в массивах были регистро независимые ? то есть $arr["foo"] и $arr["FOO"] возвращали одинаковые значения ?
 

maxru

МИФИст
Напиши интерфейс к массивам, который при занесении в массив значения по ключу (через созданный обьект массива), будет этот самый ключ в нижний/верний регистр переводить - как тебе нравится.
 

WP

^_^
Imho, кошернее геттером сделать ;)

-~{}~ 06.03.07 01:09:

PHP:
class i_array
{
 private $arr;
 public function i_array(&$arr) {$this->arr = &$arr;}
 public function __get($k)
 {
  $k = strtolower($k);
  $keys = array_keys($this->arr);
  for ($i = 0, $s = sizeof($keys); $i < $s; $i++){if (strtolower($keys[$i]) == $k) {return $this->arr[$keys[$i]];}}
 }
 public function __set($k,$v) {$this->arr[$k] = $v;}
}
$arr = array(
 'foo' => 'bar',
 'pInG' => 'pong'
);
$a = new i_array($arr);
echo $a->ping."\n";
$a->PHPcluB = 'rulez';
echo $a->phpclub;
/*
pong
rulez
*/
 

hermit_refined

Отшельник
Imho, кошернее геттером сделать
чем?
если очень хочется извратиться - наследуем от ArrayObject и переопределяем все offset*().
$k = strtolower($k);
$keys = array_keys($this->arr);
for ($i = 0, $s = sizeof($keys); $i < $s; $i++){if (strtolower($keys[$i]) == $k) {return $this->arr[$keys[$i]];}}
а это уже вообще жуть.
выборка элемента за O(n) (не говоря о лишнем array_keys).
вместо того, чтобы просто хранить все ключи в одном регистре.
 

WP

^_^
> вместо того, чтобы просто хранить все ключи в одном регистре.
Это не будет регистронезависимость) Это будет приблуда приводящая всё в один регистр.

-~{}~ 06.03.07 14:19:

Это лишь инструмент для доступа к массивам, который хранит Ссылку.
 

Андрейка

Senior pomidor developer
Это не будет регистронезависимость) Это будет приблуда приводящая всё в один регистр.
а в чем собстно разница в данном случае?
 

I_one

Guest
hermit_refined

Чехарда с ключами связанна с тем с тем что приложение написанно под Firebird и результаты запросов к базе данных возвращаються массивами с ключами в верхнем регистре ... но когда дело касаеться PostgreSQL массивы возвращаються в нижнем регистре ... я вот думаю переписать приложение, подправить исходники php, сконфигурить как нить сам движок php ... похоже остаёться только первый вариант ...
 

hermit_refined

Отшельник
я никогда не пользовался firebird, потому могу только поверить вам на слово, что там есть такая кривизна.
два приходящих на ум варианта - да, переписать приложение, или - (судя по всему у вас используется некая абстракция, коли проблем с функциями не возникает) - переопределить всякие fetch_assoc, добавив [m]array_change_key_case[/m].
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: I_one
hermit_refined
когда дело касаеться PostgreSQL массивы возвращаються в нижнем регистре ...
Для уточнения не поленюсь напишу развернуто - если я понял правильно, автор жалуется, что в постгресе имена полей таблицы хранятся в нижнем регистре, и при вызове pg_fetch_assoc получаемый массив содержит ключи тоже в нижнем регистре?
Мой ответ - постгрес хранит имена полей в заданном регистре. Задай в ветке постгреса вопрос "почему всегда в нижнем". Краткий совет - используй двойные кавычки при указании имен полей. Подозреваю, что с Firebird решение аналогично.
 

hermit_refined

Отшельник
Ответ - используй двойные кавычки при указании имен полей
на мой взгляд, это объединяет недостатки обоих вариантов.
и uppercase будет по-прежнему в скрипте красоваться, и бд изуродуем, и запросы все человеку переписывать ;-)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Если человек ориентируется на "переписать приложение" - то лучше спроектировать новое, не воюя с ветряными мельницами, а изучить и использовать реальные возможности своих платформ.
 
Сверху