2011-01-31 3 views
0

Я начинаю с запросом MySQL (не моего дизайна), который возвращает результаты, которые выглядят как:своп ключи массива, где найдены в PHP

$row['user_name']; 
$row['user_property'] 
$row['user_property_2'] 
$row['day_1'] 
$row['day_2'] 
$row['day_3'] 
$row['day_4'] 
$row['day_5'] 

То, что я хотел бы сделать это быстро (в идеале один шаг, не в цикле) заменить (повторно ключ) все имен полей, которые содержат «day_» просто иметь номер, в результате чего:

$row['user_name']; 
$row['user_property'] 
$row['user_property_2'] 
$row['1'] 
$row['2'] 
$row['3'] 
$row['4'] 
$row['5'] 

, но без какой-либо риски для других ключей имени поля.

Я представляю, какое-то решение, что включает в себя «своп» массив как:

$swap_array = ('day_1' => 1, 'day_2' => 2,'day_3' => 3, 'day_4' => 4, 'day_5' => 5); 

Но я не уверен, что функции для реализации массива подкачки. Я уверен, что раньше видел эту функцию, но не могу ее найти.

ответ

1
$arr = 
array_combine(
    explode(',', 
    preg_replace('/day_/', '', implode(',', array_keys($row)))), $row); 

PS:, что случилось с петлей?

потенциальной проблема 1 - если ключ возврата, как day_now может вызвать проблемы
потенциальной проблемы 2 - если ключ возврата содержит запятую, может вызвать проблемы

Однако, как потенциальные проблемы могут быть решены путем повышение регулярному_выражения выше


, как для собственной функции, is array_map that you looking for?

0

единственный способ, которым я могу думать об этом без зацикливания на и петь array_map:

$result = array_map(function($value, $key) use($swap_array) { 
    return array(
    $value, 
    isset($swap_array[$key]) ? $swap_array[$key] : $key 
); 
}, $input_array); 
0

Канонический метод будет:

$key_map = array_replace( # key => key    # XOR keys 
    array_combine(array_keys($row), array_keys($row)), $swap_array 
); 
$row = array_combine(array_values($key_map), array_values($row)); 

Однако я думаю, что строка замены или любое ручное отображение будет быстрее и более удобным для чтения.