Массив с ассоциативными значениями, доступ к которым осуществляется численно

StackOverflow https://stackoverflow.com/questions/1118180

  •  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 возвращает массив как с ассоциативными, так и с цифровыми ключами

http://nz.php.net/manual/en/function.mysql-fetch-array.php

Другие советы

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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top