php: самый простой способ превратить индексированный двумерный массив в ассоциативный индексированный по двумерному массиву? - PullRequest
3 голосов
/ 24 января 2011

Я постоянно выполняю запросы к базам данных и получаю многомерные массивы, представляющие строки обратно. К сожалению, индекс первого уровня является числовым, что не очень информативно. У меня часто есть таблицы со строками идентичности в таблице, и я хочу превратить полученный многомерный массив во что-то, что ассоциативно индексируется этим столбцом идентичности.

Нелегкая, самостоятельно созданная пользовательская функция, которая делает то, что я хочу:

function identity_associate($data, $identity_column='identity'){
    $res = array();
    foreach($data as $single_row){
        $loop_identity = $single_row[$identity_column];
        $res[$loop_identity] = $single_row;
    }
    return $res;
}

Очевидно, что я мог бы использовать цикл foreach каждый раз, когда я хотел сделать это, или использовать эту функцию, чтобы сделать это для меня, когда я каждый раз передаю ему данные, но если есть встроенный способ сделать это тривиально с нативные функции PHP, я бы предпочел использовать это, чтобы вместо этого исправить. Я пытался найти что-то подходящее в документах php для сортировки и массивов, но не смог найти ничего точного, и Google тоже не сильно помог. Кто-нибудь знает что-то родное php или иначе проще?

т.е. Я хочу преобразовать данные, которые я получаю, когда запрашиваю базу данных ...

array(
  array(
    'user_id'=>45,
    'identity'=>'bob',
    'name'=>'Bob'
  ),
  array(
    'user_id'=>51, 
    'identity'=>'tchalvak', 
    'name'=>'TchalVak'
  )
);

в нечто более полезное

array(
  'bob'=>array(
    'user_id'=>45, 
    'identity'=>'bob', 
    'name'=>'Bob'
  ), 
  'tchalvak'=>array(
    'user_id'=>51, 
    'identity'=>'tchalvak', 
    'name'=>'TchalVak'
  )
);

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

Edit:

Я хочу отметить, что я получаю данные в этом формате из базы данных, вызывая встроенную функцию в PDO, и она возвращает эквивалент первого массива:

$statement->execute();
return $statement->fetchAll(PDO::FETCH_ASSOC);

например. позвонив в sql ниже:

$data = query('select name, user_id, identity from users order by identity');

... получит первый массив в начале вопроса.

Ответы [ 2 ]

1 голос
/ 24 января 2011

Я думал о смещении первого элемента путем применения сопоставления массива функции array_unshift(), а затем связывания массива, возвращенного array_map(), и исходного массива с array_combine().Вот пример, имейте в виду, что он будет работать только тогда, когда элемент identity является первым элементом подмассива:

<?php
$arrs = array(
            array(
                'identity'=>'bob',
                'user_id'=>45,
                'name'=>'Bob'
            ),
            array(
                'identity'=>'tchalvak',
                'user_id'=>51, 
                'name'=>'TchalVak'
            )
        );

$identites = array_map( 'array_shift', $arrs );
$formatted = array_combine( $identites, $arrs );
print_r( $formatted );
?>

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

<?php
$arrs = array(
            array(
                'identity'=>'bob',
                'user_id'=>45,
                'name'=>'Bob'
            ),
            array(
                'identity'=>'tchalvak',
                'user_id'=>51, 
                'name'=>'TchalVak'
            )
        );

$identites = array_map( 'array_grab', $arrs );
$formatted = array_combine( $identites, $arrs );
print_r( $formatted );

function array_grab( $array ) { return( $array['identity'] ); }
?>
0 голосов
/ 24 января 2011

Я считаю, что ваш массив тоже может быть встроен в PHP. Возможно, вы сможете использовать array_map и сэкономить на foreach, но это не сильно экономит (и исключает ваш аргумент $identify_column).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...