2016-08-13 68 views
-2

请我安排在这个格式重新排列数组递归PHP

[ 
    (int) 0 => [ 
    'student_id' => 'AF/2016/SCH/001', 
    'AF101' => (float) 56, 
    'AF102' => (float) 46, 
], 

数据的数组,但我需要一个可以读取阵列和重新安排它的功能出现在格式

[ 
(int) 0 => [ 
'student_id' => 'AF/2016/SCH/001', 
'course_id' => 'AF101', 
'total' => '56', 
], 
(int) 1 => [ 
'student_id' => 'AF/2016/SCH/001', 
'course_id' => 'AF102', 
'total' => '46', 
], 
] 

在其从第一阵列产生的第二阵列,所述

'AF101' => '56' 

互换到

'course_id' => 'AF101', 
'total' => '56' 

任何贡献和建议,欢迎

+0

你有没有尝试什么吗? –

+0

请阅读[如何问](http://stackoverflow.com/help/how-to-ask)。 – zhon

回答

0

您可以在array_walk()内使用foreach()来完成,如下所示。测试:here

<?php 

    $arr = [ 
      [ 
       'student_id' => 'AF/2016/SCH/001', 
       'AF101' => (float) 56, 
       'AF102' => (float) 46, 
      ], 
      [ 
       'student_id' => 'AF/2016/SCH/003', 
       'AF101' => (float) 76, 
       'AF102' => (float) 39, 
      ], 
    ]; 

    function filterResult($arr, $result=[]){ 
     $walk = array_walk($arr, function($data) use(&$result){ 
      if(is_array($data)){ 
       foreach($data as $key=>$item){ 
        if(preg_match("#(^[A-Z]*?)(\d)#", $key)){ 
         $result[] = [ 
          'student_id' =>$data['student_id'], 
          'course_id'  => $key, 
          'total'   => $data[$key], 
         ]; 
        } 
       } 
      } 
     }); 
     return $result; 
    } 
    var_dump(filterResult($arr)); 

var_dump() above produces:

array (size=4) 
     0 => 
     array (size=3) 
      'student_id' => string 'AF/2016/SCH/001' (length=15) 
      'course_id' => string 'AF101' (length=5) 
      'total' => float 56 
     1 => 
     array (size=3) 
      'student_id' => string 'AF/2016/SCH/001' (length=15) 
      'course_id' => string 'AF102' (length=5) 
      'total' => float 46 
     2 => 
     array (size=3) 
      'student_id' => string 'AF/2016/SCH/003' (length=15) 
      'course_id' => string 'AF101' (length=5) 
      'total' => float 76 
     3 => 
     array (size=3) 
      'student_id' => string 'AF/2016/SCH/003' (length=15) 
      'course_id' => string 'AF102' (length=5) 
      'total' => float 39 
+0

非常感谢@Poiz像魔术一样工作 – Saviobosco

+0

@ user3792206好吧,然后将其标记为正确答案.... – Poiz

+0

@Poiz为什么你是否在正则表达式模式中首先使用了#标签(#),并且我似乎无法找到任何地方的原因,因为这些密钥不包含标签。使用Live正则表达式php测试器它不匹配,但运行代码的神奇。总之,好的工作,你的答案比我的好得多! – feareoc

0

此代码对你的问题,假设有没有其他每个学生子阵列比ID在和课程,成绩:

$original_array = [ 
    0 => [ 
     'student_id' => 'AF/2016/SCH/001', 
     'AF101' => 56, 
     'AF102' => 46, 
    ], 
    1 => [ 
     'student_id' => 'AF/2016/SCH/002', 
     'AF101' => 76, 
     'AF102' => 39, 
    ], 
]; 
$newarray = []; 

foreach ($original_array as $student) 
{ 
    $student_id = $student['student_id']; 
    unset($student['student_id']); 
    foreach ($student as $course_id => $score) 
    { 
     $newarray[count($newarray)] = $newarray[count($newarray)] = [ 
      'student_id' => $student_id, 
      'course_id' => $course_id, 
      'total' => $score, 
     ]; 

    } 
} 
echo '<pre>'; 
var_dump($newarray); 
+0

非常感谢您的回复。非常感谢 – Saviobosco

+0

由于@Poiz的答案更精细,你应该考虑将它标记为正确的答案 – feareoc