Массив с ассоциативными значениями, доступ к которым осуществляется численно
-
12-09-2019 - |
Вопрос
У меня есть ассоциативный массив, к которому мне может понадобиться доступ в числовом виде (т. е. получение значения 5-го ключа).
$data = array(
'one' => 'something',
'two' => 'else',
'three' => 'completely'
) ;
Мне нужно иметь возможность сделать:
$data['one']
и
$data[0]
чтобы получить то же значение, «что-то».
Моя первоначальная мысль состоит в том, чтобы создать оболочку класса, которая реализует ArrayAccess с помощью offsetGet(), имеющего код, чтобы проверить, является ли ключ числовым, и действовать соответствующим образом, используя array_values:
class MixedArray implements ArrayAccess {
protected $_array = array();
public function __construct($data) {
$this->_array = $data;
}
public function offsetExists($offset) {
return isset($this->_array[$offset]);
}
public function offsetGet($offset) {
if (is_numeric($offset) || !isset($this->_array[$offset])) {
$values = array_values($this->_array) ;
if (!isset($values[$offset])) {
return false ;
}
return $values[$offset] ;
}
return $this->_array[$offset];
}
public function offsetSet($offset, $value) {
return $this->_array[$offset] = $value;
}
public function offsetUnset($offset) {
unset($this->_array[$offset]);
}
}
Мне интересно, нет ли в PHP встроенного способа сделать это.Я бы предпочел использовать собственные функции, но пока я не видел ничего, что делало бы это.
Есть идеи?
Спасибо,
Фанис
Решение
я заметил, что вы упомянули, что это набор результатов базы данных только для чтения
если вы используете MySQL, вы можете сделать что-то вроде этого
$result = mysql_query($sql);
$data = mysql_fetch_array($result);
mysql_fetch_array
возвращает массив как с ассоциативными, так и с цифровыми ключами
Другие советы
how about this
$data = array(
'one' => 'something',
'two' => 'else',
'three' => 'completely'
) ;
then
$keys = array_keys($data);
Then
$key = $keys[$index_you_want];
Then
echo $data[$key];
Не существует встроенного способа сделать это.
Если это разовая вещь, вы можете использовать что-то вроде:
$array = array_merge($array, array_values($array));
Однако это не будет обновляться при добавлении новых элементов в массив.
Иногда проще проверить, есть ли у вас ассоциативный ключ или индекс с is_int()
if(is_int($key))
return current(array_slice($data, $key, 1));
else
return $data[$key];