2015-09-22 64 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]); 
}