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

dimagolov

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

addElements добавляет в массив _elements элементы с индексом всегда в нижнем регистре, что тут может быть непонятно?
 

bobroff

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

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

dimagolov

Новичок
bobroff, обоснуй, зачем тебе сохранять регистр индексы, когда при использовании он должен игнорироваться?
 

bobroff

Новичок
Автор оригинала: dimagolov
bobroff, обоснуй, зачем тебе сохранять регистр индексы, когда при использовании он должен игнорироваться?
Если совсем кратно, то как минимум для:
При сохранении - для удобства восприятия (длинных названий);
При использовании - для защиты от случайных ошибок.

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

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

Всем спасибо за помощь, задача решена.
 

Fortop

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

Ни одна из этих причин не требует сохранения регистра.
 

bobroff

Новичок
Думаю тему можно закрыть, т.к. решение вопроса найдено и она перерастает во флуд.
 

Actor

Новичок
Написал свой вариант.
Если кто-то может улучшить, дать советы - милости прошу, потому что мне кажется не совсем рациональным постоянно пересчитывать.
Да, есть вариант по оптимизации, предварительно рассчитав всё, и делать унификацию ключей ТОЛЬКО при удалении/добавлении элемента.
Перегрузить метод __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'];

?>
 

Beavis

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

Fortop

Новичок
Actor
Прежде чем писать, надо понять что мы хотим получить.

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

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

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

Actor

Новичок
Fortop
Прочитайте внимательно то, что требует автор темы.
Он пожелал хранить ключи именно в таком видео, в каком они записаны.

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

PHP:
<?php

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

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

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

PHP:
<?php

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

?>
Но, хозяин - барин, и если хочет так, то пускай будет так.
 

Fortop

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

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

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

Actor

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

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

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

dimagolov

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

Beavis

Banned
Автор оригинала: Actor
Fortop
Прочитайте внимательно то, что требует автор темы.
Он пожелал хранить ключи именно в таком видео, в каком они записаны.
а я если я что-нибудь пожелаю, ты тоже безоговорочно исполнишь?) тогда не уходи далеко)))
 

Actor

Новичок
Автор оригинала: Beavis
а я если я что-нибудь пожелаю, ты тоже безоговорочно исполнишь?) тогда не уходи далеко)))
Бееедненький, за любую возможность быть замеченым цепляешься :(
 

Beavis

Banned
Автор оригинала: Actor
Бееедненький, за любую возможность быть замеченым цепляешься :(
не реви, лучше допиши ещё пару десятков строк комментариев к своему коду, чтоб хоть как-то оправдать этот бред :D
 

Fortop

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

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

Организовать description к страницам в меню можно легко и просто, если не пытаться этот самый description использовать в качестве ключа.
 

Actor

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

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

dimagolov

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