2015-09-22 65 views
1

我需要修改多維數組的一些內容。 首先,我需要將包含數組的鍵轉換爲同一數組的元素。爲了做到這一點,我需要找到鑰匙的名字。這裏的問題是密鑰不斷改變它的名字。我將基於修改的關鍵點叫做「grupo *」和一個數字。查找多維關聯數組上的鍵並修改數組結構(PHP)

這裏的陣列的示例(使用的print_r()PHP函數中提取):

Array 
(
    [codigo] => 21201 
    [nombre] => CALCULO INTEGRAL 
    [creditos] => 3 
    [grupo8] => Array 
     (
      [horario] => Array 
       (
        [martes] => Array 
         (
          [salon] => Array 
           (
            [0] => G-216 
            [1] => G-216 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1600 
            [1] => 1700 
           ) 
          [horaFin] => Array 
           (
            [0] => 1700 
            [1] => 1800 
           ) 
         ) 
        [jueves] => Array 
         (
          [salon] => Array 
           (
            [0] => C-102 
            [1] => C-102 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1600 
            [1] => 1700 
           ) 
          [horaFin] => Array 
           (
            [0] => 1700 
            [1] => 1800 
           ) 
         ) 
       ) 
     ) 
) 
Array 
(
    [codigo] => 21202 
    [nombre] => FISICA MECANICA 
    [creditos] => 4 
    [grupo1] => Array 
     (
      [horario] => Array 
       (
        [lunes] => Array 
         (
          [salon] => Array 
           (
            [0] => Lab B-207 
            [1] => Lab B-207 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1300 
            [1] => 1400 
           ) 
          [horaFin] => Array 
           (
            [0] => 1400 
            [1] => 1500 
           ) 
         ) 
        [martes] => Array 
         (
          [salon] => Array 
           (
            [0] => G-110 
            [1] => G-110 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1300 
            [1] => 1400 
           ) 
          [horaFin] => Array 
           (
            [0] => 1400 
            [1] => 1500 
           ) 
         ) 
        [jueves] => Array 
         (
          [salon] => Agora 101 
          [horaInicio] => 1300 
          [horaFin] => 1400 
         ) 
       ) 
     ) 
) 
Array 
(
    [codigo] => 21203 
    [nombre] => ALGEBRA LINEAL 
    [creditos] => 3 
    [grupo13] => Array 
     (
      [horario] => Array 
       (
        [lunes] => Array 
         (
          [salon] => B-108 
          [horaInicio] => 1100 
          [horaFin] => 1200 
         ) 
        [viernes] => Array 
         (
          [salon] => Array 
           (
            [0] => B-107 
            [1] => B-107 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1000 
            [1] => 1100 
           ) 
          [horaFin] => Array 
           (
            [0] => 1100 
            [1] => 1200 
           ) 
         ) 
       ) 
     ) 
) 
Array 
(
    [codigo] => 21304 
    [nombre] => PROGRAMACION ORIENTADA A OBJETOS 
    [creditos] => 3 
    [grupo4] => Array 
     (
      [horario] => Array 
       (
        [miercoles] => Array 
         (
          [salon] => Array 
           (
            [0] => B209 lab 
            [1] => B209 lab 
            [2] => B209 lab 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1400 
            [1] => 1500 
            [2] => 1600 
           ) 
          [horaFin] => Array 
           (
            [0] => 1500 
            [1] => 1600 
            [2] => 1700 
           ) 
         ) 
       ) 
     ) 
) 
Array 
(
    [codigo] => 275201 
    [nombre] => MATEMATICAS DISCRETAS 
    [creditos] => 2 
    [grupo2] => Array 
     (
      [horario] => Array 
       (
        [jueves] => Array 
         (
          [salon] => Array 
           (
            [0] => A-203 
            [1] => A-203 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1100 
            [1] => 1200 
           ) 
          [horaFin] => Array 
           (
            [0] => 1200 
            [1] => 1300 
           ) 
         ) 
       ) 
     ) 
) 
Array 
(
    [codigo] => MAKE 
    [nombre] => MARKETING ELECTRONICO 
    [creditos] => 2 
    [grupo1] => Array 
     (
      [horario] => Array 
       (
        [viernes] => Array 
         (
          [salon] => Array 
           (
            [0] => G-219 
            [1] => G-219 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1200 
            [1] => 1300 
           ) 
          [horaFin] => Array 
           (
            [0] => 1300 
            [1] => 1400 
           ) 
         ) 
       ) 
     ) 
) 

正如可以看到的,關鍵[GRUPO *]不斷變化數量,並且它可以是一個1或2位數字。我唯一知道的就是這樣一個鍵包含一個數組。

我需要對內部數組中的一個做同樣的事情,那是一個工作日。

這裏是數組應該如何看(如JSON)爲例:

{ 
    "codigo": "21201", 
    "nombre": "CALCULO INTEGRAL", 
    "creditos": "3", 
    "grupo": "8", 
    "horario": [ 
     { 
      "dia": "martes", 
      "salon": [ 
       "G-216", 
       "G-216" 
      ], 
      "horaInicio": [ 
       "1600", 
       "1700" 
      ], 
      "horaFin": [ 
       "1700", 
       "1800" 
      ] 
     }, 
     { 
      "dia": "jueves", 
      "salon": [ 
       "C-102", 
       "C-102" 
      ], 
      "horaInicio": [ 
       "1600", 
       "1700" 
      ], 
      "horaFin": [ 
       "1700", 
       "1800" 
      ] 
     } 
    ] 
} 

平日不斷變化,所以我有一個類似的問題在那裏。

回答

0

舊陣列

Array 
(
    [0] => Array 
     (
      [codigo] => MAKE 
      [nombre] => MARKETING ELECTRONICO 
      [creditos] => 2 
      [grupo12] => Array 
       (
        [horario] => Array 
         (
          [lunes] => Array 
           (
            [salon] => Array 
             (
              [0] => G-219 
              [1] => G-219 
             ) 

            [horaInicio] => Array 
             (
              [0] => 1200 
              [1] => 1300 
             ) 

            [horaFin] => Array 
             (
              [0] => 1300 
              [1] => 1400 
             ) 

           ) 

         ) 

       ) 

     ) 

    [1] => Array 
     (
      [codigo] => MAKE 
      [nombre] => PROGRAMACION ORIENTADA A OBJETOS 
      [creditos] => 3 
      [grupo13] => Array 
       (
        [horario] => Array 
         (
          [viernes] => Array 
           (
            [salon] => Array 
             (
              [0] => B209 lab 
              [1] => B209 lab 
             ) 

            [horaInicio] => Array 
             (
              [0] => 1400 
              [1] => 1500 
             ) 

            [horaFin] => Array 
             (
              [0] => 1600 
              [1] => 1700 
             ) 

           ) 

         ) 

       ) 

     ) 

) 

所有的代碼

一行
foreach ($data as $k => $groups) { 
    foreach ($groups as $v => $group) { 
     // find the match 
     if (preg_match('/^grupo*/', $v)) { 
      // split the key into key and value. 
      $key = substr($v, 0, 5); 
      $value = substr($v, 5); 
      // push the key into the array and assign its value 
      $data[$k][$key] = $value; 
      // loop through the horario array 
      foreach ($group['horario'] as $d => $dia) { 
       // push dia as key into horario array assign the key $d as value 
       $group['horario'][] = ['dia'=>$d,$dia]; 
       //push the sub arrays into the new horario array 
       //foreach ($dia as $a => $arr) { 
       // $group['horario'][$a] = $arr; 
       //} 
       //unset the old horario array 
       unset($group['horario'][$d]); 
      } 
      // push the new horario in the main array 
      $data[$k]['horario'] = $group['horario']; 
      // unset the old grupo array 
      unset($data[$k][$v]); 

     } 
    } 
} 

echo json_encode($data, JSON_PRETTY_PRINT); 
[ 
    { 
     "codigo": "MAKE", 
     "nombre": "MARKETING ELECTRONICO", 
     "creditos": 2, 
     "grupo": "12", 
     "horario": [ 
      { 
       "dia": "lunes", 
       "0": { 
        "salon": [ 
         "G-219", 
         "G-219" 
        ], 
        "horaInicio": [ 
         "1200", 
         "1300" 
        ], 
        "horaFin": [ 
         "1300", 
         "1400" 
        ] 
       } 
      }, 
      { 
       "dia": "martes", 
       "0": { 
        "salon": [ 
         "G-219", 
         "G-219" 
        ], 
        "horaInicio": [ 
         "1200", 
         "1300" 
        ], 
        "horaFin": [ 
         "1300", 
         "1400" 
        ] 
       } 
      } 
     ] 
    } 
] 

希望這有助於。

+0

幾乎完美,你錯過了preg_match函數中的')'。這正是我需要的,謝謝! – HaPK

+0

@HaPK不客氣,我會添加缺少的括號。 :)。 – mdamia

+0

還有另一個bug,注意有時候「horario」數組有幾個不同的日子,但是你的代碼只添加數組中的最後一天。我試圖通過在'group ['horario']'foreach循環內添加一個簡單的'$ dias [] = $ group ['horario'];'然後像'$ data [$ k] [' horario'] = $ dias;'但它不起作用。 – HaPK

0

假設你的數組是:

Array 
(
    [codigo] => 21201 
    [nombre] => CALCULO INTEGRAL 
    [creditos] => 3 
    [grupo8] => Array 
     (
      [horario] => Array 
       (
        [martes] => Array 
         (
          [salon] => Array 
           (
            [0] => G-216 
            [1] => G-216 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1600 
            [1] => 1700 
           ) 
          [horaFin] => Array 
           (
            [0] => 1700 
            [1] => 1800 
           ) 
         ) 
        [jueves] => Array 
         (
          [salon] => Array 
           (
            [0] => C-102 
            [1] => C-102 
           ) 
          [horaInicio] => Array 
           (
            [0] => 1600 
            [1] => 1700 
           ) 
          [horaFin] => Array 
           (
            [0] => 1700 
            [1] => 1800 
           ) 
         ) 
       ) 
     ) 
) 

你可以得到它的所有按鍵與array_keys

$keys = array_keys($arr); 
$needed_key = false; 
foreach ($keys as $k) { 
    if (strpos($k, 'grupo') !== false) { 
     $needed_key = $k; 
     break; 
    } 
} 

if ($needed_key) { 
    $arr['horario'] = $arr[$needed_key]['horario']; 
    $arr['grupo'] = substr($needed_key, 5); 
    unset($arr[$needed_key]); 
}