Получить элемент массива по ключу (вне зависимости от регистра) и присвоить ему значе

  • Автор темы Автор темы bobroff
  • Дата начала Дата начала
bobroff, ты можешь связывать слова в предложении, чтобы было понятно что ты хочешь сказать?

addElements добавляет в массив _elements элементы с индексом всегда в нижнем регистре, что тут может быть непонятно?
 
Автор оригинала: dimagolov
bobroff, ты можешь связывать слова в предложении, чтобы было понятно что ты хочешь сказать?

addElements добавляет в массив _elements элементы с индексом всегда в нижнем регистре, что тут может быть непонятно?
См. пост №1:
"P.S.: вариант хранения индексов массива в верхнем или нижнем регистре не предлагать...".
Решить таким способом свою задачу я мог бы и не создавая тему. По-поводу этого в данной теме уже было достаточно шуток...
 
bobroff, обоснуй, зачем тебе сохранять регистр индексы, когда при использовании он должен игнорироваться?
 
Автор оригинала: dimagolov
bobroff, обоснуй, зачем тебе сохранять регистр индексы, когда при использовании он должен игнорироваться?
Если совсем кратно, то как минимум для:
При сохранении - для удобства восприятия (длинных названий);
При использовании - для защиты от случайных ошибок.

Подробно описывать слишком долго, но это обоснованно.

Есть задача - должно быть решение.

Всем спасибо за помощь, задача решена.
 
Если совсем кратно, то как минимум для:
При сохранении - для удобства восприятия (длинных названий);
При использовании - для защиты от случайных ошибок.
Бред.

Ни одна из этих причин не требует сохранения регистра.
 
Думаю тему можно закрыть, т.к. решение вопроса найдено и она перерастает во флуд.
 
Написал свой вариант.
Если кто-то может улучшить, дать советы - милости прошу, потому что мне кажется не совсем рациональным постоянно пересчитывать.
Да, есть вариант по оптимизации, предварительно рассчитав всё, и делать унификацию ключей ТОЛЬКО при удалении/добавлении элемента.
Перегрузить метод __unset и offsetSet.
Учтите, что мой вариант НЕ учитывает многомерные массивы, уж пробегайтесь по нему сами и меняйте.

Собственно, код:

PHP:
<?php

/**
 * (c) Actor :: phpclub.ru
 **/

final class InsensetiveArray extends ArrayObject
{
	/**
	 * Перегружаем класс доступа и на основе этого
	 * предоставляем возможность получения значения
	 * массива по индексу без учета регистра
	 */
	public function offsetGet($index) {
		if(!isset($this[$index])) {
			// Для того, чтобы постоянно не рассчитывать это,
			// можно организовать "умный" кеш на основе
			// перегрузки метода offsetSet, но я ограничусь
			// простеньким примером, без наворотов. Сами их сделаете
			$changed = array_change_key_case($this->getArrayCopy());
			
			if(isset($changed[$index])) {
				return $changed[$index];
			} else trigger_error('Undefined index: '.$index);
		} else return parent :: offsetGet($index);
	}
};

// Создаем ArrayObject
$names = new InsensetiveArray(array(
	"bLaCK"	 => "Афро-американец",
	"Yellow" => "Японец",
	"WhiTe " => "Эстонец",
	"RED"	 => "Неизвестный"
));

echo $names['black'];

?>
 
я заметил, видимо это очень модно, когда создаешь класс, писать комментариев больше чем остального кода, зачем то делать класс final и копирайты ставить, а то мало ли, кто-нибудь украдет такую ценность=)
 
Actor
Прежде чем писать, надо понять что мы хотим получить.

Если мы хотим иметь доступ к ключам исключительно в case insensitive, то нет никакого смысла постоянно заниматься преобразованием всего массива и изобретать велосипеды.

Достаточно нормализовать ключ при добавлении и при доступе.
Таким образом храниться у нас все будет уже в нормализованном виде и искаться будет стандартными же функциями - без постоянных конвертаций всего массива.

Собственно конечная нормальная форма ключа(ARRAY_KEY, arrayKey, array_key) не имеет значения главное чтобы все хранилось именно в ней.
 
Fortop
Прочитайте внимательно то, что требует автор темы.
Он пожелал хранить ключи именно в таком видео, в каком они записаны.

Кроме того, не стоит, наверное, забывать, что ключом массива в РНР может быть строка. А если это так, то, допустим, наша строка может содержать название категории (на русском языке с пробелом).
Предположим:

PHP:
<?php

$sections = array(
    'О нас' => 'about.html',
    'Новости' => 'modules/news.html'
);

foreach($sections as $name => $url) {
    // ( ... )
}

?>

В таком случае, если мы будем при записи приводить это всё к единомы виду, но на выходе получим просто-напросто кашу.
Лично я излишне консервативен и придерживаюсь числовых индексов.
Ведь у нас быть может и такой вариант:

PHP:
<?php

$sections = array(
    array(
        'О нас', 'about.html'
    )
);

?>

Но, хозяин - барин, и если хочет так, то пускай будет так.
 
что требует автор темы.
Автор темы сам не знает что хочет. Перечитайте топик, это уже не первая тема такого рода.

Хранить ключи в том виде в каком они записаны, если все остальное делается абсолютно регистронезависимо - это стремление получить геморрой там, где можно без него обойтись.
Что успешно и было доказано приведенными решениями.

что ключом массива в РНР может быть строка
В таком случае, если мы будем при записи приводить это всё к единомы виду, но на выходе получим просто-напросто кашу
С какого бодуна?
 
Автор оригинала: Fortop
С какого бодуна?
Не рвем фразы из контекста, а читаем и вникаем.
Если уж никак самостоятельно не вникается, разжую:

Ключ массива вида
"Списки РосСтройДом"
При приведении их к одному виду выдадут:
"списки росстройдом"
Это явно не то, что было задумано в оригинале.

Впрочем, лишний раз убеждаюсь в том, как же я не люблю ассоциативные массивы.
 
Actor, дело в том, что задача у автора надуманная, а аналогичного результата можно достичь множеством других способов. но для этого нужно четко сформулировать задачу, причем так, чтобы в ней не было логических противоречий, чего автор сделать не удосужился.
 
Автор оригинала: Actor
Fortop
Прочитайте внимательно то, что требует автор темы.
Он пожелал хранить ключи именно в таком видео, в каком они записаны.
а я если я что-нибудь пожелаю, ты тоже безоговорочно исполнишь?) тогда не уходи далеко)))
 
Автор оригинала: Beavis
а я если я что-нибудь пожелаю, ты тоже безоговорочно исполнишь?) тогда не уходи далеко)))
Бееедненький, за любую возможность быть замеченым цепляешься :(
 
Автор оригинала: Actor
Бееедненький, за любую возможность быть замеченым цепляешься :(
не реви, лучше допиши ещё пару десятков строк комментариев к своему коду, чтоб хоть как-то оправдать этот бред :D
 
Ключ массива вида
"Списки РосСтройДом"
При приведении их к одному виду выдадут:
"списки росстройдом"
Это явно не то, что было задумано в оригинале.
Что за бред? Где в цитате массив? Вы можете разобраться хотя бы в собственных мыслях?

Ключ это именно ключ, а не информация. Поэтому абсолютно безразлично к каком виде он представлен, он должен однозначно идентифицировать элемент.

Организовать description к страницам в меню можно легко и просто, если не пытаться этот самый description использовать в качестве ключа.
 
Автор оригинала: Beavis
не реви, лучше допиши ещё пару десятков строк комментариев к своему коду, чтоб хоть как-то оправдать этот бред :D
Не захлебнись :)

Fortop
Лана, пофиг, спорить влом, тем более что всё сказанное абсолютно справедливо, а отстаивать чужие интересы, тем более если они такие бредовые как у ТС, я не намерен. Но!
Есть задача - есть и решение.
Я пришел сюда не говорить о целесообразности использования именно такого подхода поскольку, повторяю: есть задача - есть и решение.
 
есть задача - есть и решение.
Actor, в 99% случаев дурацкая задача означает, что автор не знает как сделать ее нормально, и данный форум помогает не решить дурацкую задачу, а для начала сформулировать ее правильно, а потом решить. а ты выставляешь себя таким же дураком как и ТС бросаясь решать всякие глупости.
 
Сверху