PHP « Как красиво получить из массива значение по ключу

Предположим есть функция User(), которая большой ассоциативный массив, как из этого массива получить значение только по одному ключу, вот что то типо такого

$user_name = User().['user_name'];


понятно что верхнее выражение не правильное.

1 ответов


Такое устроит?


function User($field=false)
{
    $return = array(
        'username' => 'test',
        'field1' => 'value1',
        'field2' => 'value2',
        'field3' => 'value3',
    );
    return $field ? $return[$field] : $return;
}

Variant 1
$username = User('username');

Variant2
$User = User();
$username = $User['username'];
 

Крепитесь, люди. Скоро 5.4 выйдет. А может и не очень скоро.

Такая фишка как array dereferencing появилась только в PHP 5.4.0 Alpha 1. А сейчас только через переменную(если не изменять интерфейс метода).


Как вариант, функция-хэлпер для работы с массивами.


/**
 * Retrieve a single key from an array. If the key does not exist in the
 * array, the default value will be returned instead.
 *
 *     // Get the value "username" from $_POST, if it exists
 *     $username = arr_get($_POST, 'username');
 *
 *     // Get the value "sorting" from $_GET, if it exists
 *     $sorting = arr_get($_GET, 'sorting');
 *
 * @param   array   $array      array to extract from
 * @param   string  $key        key name
 * @param   mixed   $default    default value
 * @return  mixed
 */

function arr_get($array, $key, $default = NULL)
{
    return isset($array[$key]) ? $array[$key] : $default;
}
 

вызываем

arr_get(User(), 'user_name')
 


array_intersect_key(User(),array('SOME_KEY_TO_GET' => ''))
 

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

С дополнительной переменной более производительный вариант, но он засоряет код. Можно функцию обёртку написать для этой цели, что является более правильным вариантом (но не такую которая вначале выбрана как верный вариант, а что-нибудь наподобие этого:

function get_func_arr_value (array $array, $key) {
  return (array_key_exists($key,$array) ? $array[$key] : NULL);
}
 
Если что, я функцию не тестировал, но мысль я верно передал.

Чем так плохо?:


$id = 1;
$user = User($id); // ф-я возвращает ассоциативный массив
$userName = $user['user_name'];

echo $userName;
 

Если можно изменить возвращаемое функцией значение, то лучше возвращать object, а не array:


function User()
{
return (object)array('user_name' => 'Vasya');
}

echo User()->user_name;
 

Если нельзя изменить функцию, то можно конвертировать результат в object:


function a2o( $array ){
  foreach( $array as $key => $value ){
    if( is_array( $value ) ) $array[ $key ] = a2o( $value );
  }
  return (object) $array;
}

function User()
{
return array('user_name' => 'Vasya');
}

echo a2o(User())->user_name;
 

Что-то я не понял, а о чем речь вообще?
Объясните чайнику. В чем суть вопроса, и в чем суть ответов?
Я серьезно.