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

bobroff

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

Здравствуйте.

К примеру есть массив
PHP:
$values = array(
   'Black' => 87,
   'Green' => 21,
   'White' => 43
);
Необходимо получить элемент массива по ключу и присвоить ему значение. Условие осложняется тем, что элемент массива необходимо получить вне зависимости от регистра.
Пример:

PHP:
function setValue($name,$value)
{
$values[$name] = $value;
}
Например, передав в функцию параметр $name равный 'BLACK', 'black' или 'blACk', значение должно присвоиться только элементу массива $values['Black'].

Как это сделать?

Заранее спасибо...

P.S.: вариант хранения индексов массива в верхнем или нижнем регистре не предлагать...
 

DIG

Новичок
Партнер клуба
Ну так дописывайте свою функцию setValue() чтоб она искала эти ключи.

А вообще конечно ситуация ваша напоминает такую:

Никак не получается нормально заняться сексом.
Пробую в гамаке, стоя.

Помогите, но варианты лежа и на кровати не предлагать.
 

bobroff

Новичок
Автор оригинала: DIG
Ну так дописывайте свою функцию setValue() чтоб она искала эти ключи.
Если б знал как -не спрашивал...

Автор оригинала: DIG
А вообще конечно ситуация ваша напоминает такую:

Никак не получается нормально заняться сексом.
Пробую в гамаке, стоя.

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

crocodile2u

http://vbolshov.org.ru
может быть, http://php.net/array_change_key_case поможет (упс, я не дочитал нелепейший P.S.).

Вопрос странный, а приведенный пример функции заведомо нерабочий.

Я мог бы предложить решение, но мое мнение такое: bobroff, ты либо сам не знаешь, чего хочешь, либо не умеешь объяснить. Расскажи, для чего тебе нужен весь этот изврат и найдется нормальный вариант.

-~{}~ 19.03.10 10:11:

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

- Когда видно, так и дурак долетит. Господин барон любит, чтоб было потруднее.
 

bobroff

Новичок
http://php.net/array_change_key_case использую при поиске индекса массива, но как его использовать для получения элемента массива по индексу?

-~{}~ 19.03.10 10:20:

Автор оригинала: crocodile2u
Я мог бы предложить решение, но мое мнение такое: bobroff, ты либо сам не знаешь, чего хочешь, либо не умеешь объяснить. Расскажи, для чего тебе нужен весь этот изврат и найдется нормальный вариант.
Нужно это все для следующего.
Есть массив который содержит названия моделей и их элементы:
PHP:
$models = array(
   'User'        => array(    
         0 => 'Id',
         1 => 'Title'                   
   ),
   'Message' => array(
         0 => 'Id',
         1 => 'Title'     
   );
);
Необходимо функцией типа _addElement($modelname,$elementname) добавлять названия моделей и элементов в это массив, с условием что названия имен моделей и элементов регистронезависимые ('Message','MeSSage','message' - одна и та же модель)и не должны дублироваться.
 

crocodile2u

http://vbolshov.org.ru
Так. Модели - это некие сущности, существующие в базе данных? User и Message - это типа отображение таблиц БД и их колонок на PHP-код ?
 

bobroff

Новичок
Автор оригинала: crocodile2u
Так. Модели - это некие сущности, существующие в базе данных? User и Message - это типа отображение таблиц БД и их колонок на PHP-код ?
Не совсем так. Физически это классы (их название) и название их элементов. Свои данные они хранят в базе. Но на реализации кода добавления значений в массив это никак не отражается.
 

Beavis

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

Автор оригинала: bobroff
P.S.: вариант хранения индексов массива в верхнем или нижнем регистре не предлагать...
в таком случае остается только вариант перебора в цикле всех ключей массива
 

bobroff

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

Автор оригинала: Beavis
в таком случае остается только вариант перебора в цикле всех ключей массива
спасибо
 

crocodile2u

http://vbolshov.org.ru
Есть мнение, что ты просто делаешь ненужную работу. Почему бы не описывать свойства класса в классе?
 

AmdY

Пью пиво
Команда форума
пистолет для стрельбы в ногу.
PHP:
function setValue(&$data, $name,$value) {
        foreach($values AS $key => $v) {
        if (strtolower($key) == strtolower($name)) {
            $data[$key] = $value;
        }
    }
}
и вообще как в примере ТС всё должно было работать $value[$name] = $value??? необходимо передавать сами данные
crocodile2u +1, единственный правильный вариант - сменить подход. чтобы граблей таких не нужно было.
 

Fortop

Новичок
Есть мнение, что ты просто делаешь ненужную работу. Почему бы не описывать свойства класса в классе?
Стоит почитать другие топики ТС, который один другого фееричнее и вопрос отпадет.
 

bobroff

Новичок
Автор оригинала: crocodile2u
Есть мнение, что ты просто делаешь ненужную работу. Почему бы не описывать свойства класса в классе?
А где написано что я так не делаю?

-~{}~ 19.03.10 19:06:

Автор оригинала: Fortop
Стоит почитать другие топики ТС, который один другого фееричнее и вопрос отпадет.
Да, вот такие мы - новички. "И смех и грех..."

Кстати, на дружественных форумах народ как-то более отзывчив и не пишет типа "Стоит почитать другие топики ТС, который один другого фееричнее и вопрос", т.к. я уже мега-супер php-кодер и выставляю это всем на показ, а то никто не видит...
 

DIG

Новичок
Партнер клуба
Автор оригинала: bobroff
Кстати, на дружественных форумах народ как-то более отзывчив и не пишет типа "Стоит почитать другие топики ТС, который один другого фееричнее и вопрос", т.к. я уже мега-супер php-кодер и выставляю это всем на показ, а то никто не видит...
Я не мега и тем более супер php-кодер, я тоже новичек, но я не задаю здесь вопросов, ответы на которые можно найти в гугле или чуть-чуть подумав.

И если Вам нравятся другие форумы, почему Вы пришли на этот? Я Вам подскажу почему. Потому что это единственный форум на котором учат и помогают ДУМАТЬ и НАХОДИТЬ решения САМОСТОЯТЕЛЬНО. Понятно что это сложнее чем получить готовый код на "дружественном" форуме.

Извините, накипело. Каждый день здесь появляются темы с одинаковым развитием событий.
 

bobroff

Новичок
Автор оригинала: DIG
Я не мега и тем более супер php-кодер, я тоже новичек, но я не задаю здесь вопросов, ответы на которые можно найти в гугле или чуть-чуть подумав.

И если Вам нравятся другие форумы, почему Вы пришли на этот? Я Вам подскажу почему. Потому что это единственный форум на котором учат и помогают ДУМАТЬ и НАХОДИТЬ решения САМОСТОЯТЕЛЬНО. Понятно что это сложнее чем получить готовый код на "дружественном" форуме.

Извините, накипело. Каждый день здесь появляются темы с одинаковым развитием событий.
Перед тем как задать вопрос, я его сам часа 2 решал. Наверное сам ступил, т.к. решение довольно тривиальное, но думал, что средствами php можно написать более "красивое" решение этого вопроса.
 

Вурдалак

Продвинутый новичок
На этом форуме издеваться любят больше — факт. Но есть и свои плюсы. В погоне за повышением ЧСВ каждый найдёт у другого ошибку и тыкнет в неё.
 

Fortop

Новичок
bobroff
Я не знаю, что такое дружественные форумы...
Но это
P.S.: вариант хранения индексов массива в верхнем или нижнем регистре не предлагать...
а вы попробуйте стоя в гамаке...
неконструктивные подходы. И точно такое же наблюдалось и в других топиках.

Хранить все в одном регистре (да, да, именно то что Вы просили не предлагать), раз уж у Вас регистронезависимые имена моделей, и при добавлении новых элементов обязательно приводить к нужному виду [m]strtolower[/m]/[m]strtoupper[/m]

Поиск же производить банальными
PHP:
in_array(strtolower($value), $array);
или
PHP:
array_key_exists(strtolower($key), $array);
Поэтому либо Вы хотите научиться и слушаете то, что Вам рекомендуют.
Либо продолжаете выпендриваться с дурацкими условиями "стоя в гамаке"
 

bobroff

Новичок
Как искать значение вне зависимости от регистра было понятно изначально, а вот как его получить и изменить - вопрос.

-~{}~ 19.03.10 19:46:

Кому интересно, вот что получилось.

Сам код:
PHP:
    final protected function _setModelElementName($modelname, $elementname)
    {
        if($modelname === NULL OR $elementname === NULL) throw new iCore_Model_Element_Exception("NO_REQUIRED_PARAM");  
        
        if(!(is_string($modelname)) OR !(is_string($elementname))) throw new iCore_Model_Element_Exception("WRONG_PARAM_FORMAT");

        if($this->_getModelName() === NULL) throw new iCore_Model_Element_Exception("NO_MODELS_NAME"); 
        
        if(!($this->_isModel($modelname))) throw new iCore_Model_Element_Exception("NOT_MODEL",$modelname);       
        
        if(!($this->_isModelElement($modelname, $elementname))) throw new iCore_Model_Element_Exception("NOT_MODEL_ELEMENT",array($elementname,$modelname));
        
        if(!($this->_hasModelName($modelname))) throw new iCore_Model_Element_Exception("MODEL_NOT_DECLARE_IN_ELEMENT", array($modelname,$this->getElementName()));

        if(!(array_key_exists(strtolower($modelname),array_change_key_case($this->_modelElementName,CASE_LOWER))))
        {
            $this->_modelElementName[$modelname] = array($elementname);    
        }
        else
        {
            foreach($this->_modelElementName as $currentmodelname => $currentmodelelements)
            {      
                if(strtolower($currentmodelname) === strtolower($modelname))
                {
                    if(array_search(strtolower($elementname),array_map('strtolower',$currentmodelelements)) === false)
                    {  
                         array_push($this->_modelElementName[$currentmodelname],$elementname);    
                    }      
                }
           }          
        }
        
        Zend_Debug::dump($this->_modelElementName);
        return $this;
    }
Код в классе-наследнике:
PHP:
        $this->_setModelElementNames(array(
            'User' => 'Id',
            'user' => 'id',
            'USER' => 'ID',
            'Message'  => array('Id'),
            'UserScore'    => array('Id','Point','POINT'),   
        ));
Var_dump выходе после каждой итерации:
PHP:
array(1) {
  ["User"] => array(1) {
    [0] => string(2) "Id"
  }
}

array(1) {
  ["User"] => array(1) {
    [0] => string(2) "Id"
  }
}

array(1) {
  ["User"] => array(1) {
    [0] => string(2) "Id"
  }
}

array(2) {
  ["User"] => array(1) {
    [0] => string(2) "Id"
  }
  ["Message"] => array(1) {
    [0] => string(2) "Id"
  }
}

array(3) {
  ["User"] => array(1) {
    [0] => string(2) "Id"
  }
  ["Message"] => array(1) {
    [0] => string(2) "Id"
  }
  ["UserScore"] => array(1) {
    [0] => string(2) "Id"
  }
}

array(3) {
  ["User"] => array(1) {
    [0] => string(2) "Id"
  }
  ["Message"] => array(1) {
    [0] => string(2) "Id"
  }
  ["UserScore"] => array(2) {
    [0] => string(2) "Id"
    [1] => string(5) "Point"
  }
}

array(3) {
  ["User"] => array(1) {
    [0] => string(2) "Id"
  }
  ["Message"] => array(1) {
    [0] => string(2) "Id"
  }
  ["UserScore"] => array(2) {
    [0] => string(2) "Id"
    [1] => string(5) "Point"
  }
}
 

Fortop

Новичок
а вот как его получить и изменить - вопрос.
Да точно также.

PHP:
protected $_elements = array();
public function addElements(array $elements) {
    foreach ($elements as $key => $val) {
        $this->_elements[strtolower($key)] = $val;
    }
}

public function getElement($key) {
    $result = false;
    $normalizedKey = strtolower($key);

    if (array_key_exists($normalizedKey, $this->_elements) {
        $result = $this->_elements[$normalizedKey];
    }
    return $result;
}
 

bobroff

Новичок
Автор оригинала: Fortop
Да точно также.

PHP:
protected $_elements = array();
public function addElements(array $elements) {
    foreach ($elements as $key => $val) {
        $this->_elements[strtolower($key)] = $val;
    }
}

}
Имхо этот вариант не рабочий, т.к. вот тут "foreach ($elements as $key => $val)" $key, например, может быть равным 'USER',
а ниже, вот тут $this->_elements[strtolower($key)] = $val $key превратить в 'user' и в массив $this->_elements вставить новый элемент с индексом 'user'. Или я не прав?

Вообщем выше я уже написал полностью рабочий вариант.
 
Сверху