Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 二维数组到多维数组_Php - Fatal编程技术网

Php 二维数组到多维数组

Php 二维数组到多维数组,php,Php,这就是我所拥有的: [courses] => array ( array([id]=>1,[name]=>"course_1",[age]=>16,[location]=>"Berlin"), array([id]=>2,[name]=>"course_1",[age]=>18,[location]=>"Berlin"), array([id]=>3,[name]=>"course_1",[age]=>20,[l

这就是我所拥有的:

[courses] => array
(
  array([id]=>1,[name]=>"course_1",[age]=>16,[location]=>"Berlin"),
  array([id]=>2,[name]=>"course_1",[age]=>18,[location]=>"Berlin"),
  array([id]=>3,[name]=>"course_1",[age]=>20,[location]=>"Berlin"),
  array([id]=>4,[name]=>"course_1",[age]=>16,[location]=>"London"),
  array([id]=>5,[name]=>"course_1",[age]=>18,[location]=>"Rome"),
  array([id]=>6,[name]=>"course_2",[age]=>16,[location]=>"Berlin")

);
我需要的是将其转换为如下多维数组:
-每个名字可以有多个年龄
-每个年龄段可以有多个位置
-不需要id

因此,新转换的阵列应该具有多个年龄段、多个位置的课程

我首先尝试为每个键创建一个数组:

// all courses, sorted, once
$x = 0;
$course_names = array();
foreach ($courses as $item) {
    $course_names[$x] = $item['name'];
    $x++;
}

$course_names = array_unique($course_names);
sort($course_names);

// all ages, sorted, once
$x = 0;
$ages = array();
foreach ($courses as $item) {
    $ages[$x] = $item['age'];
    $x++;
}

$ages = array_unique($ages);
sort($ages);

// all locations, sorted, once
$x = 0;
$locations = array();
foreach ($courses as $item) {
    $locations[$x] = $item['location'];
    $x++;
}

$location = array_unique($location);
sort($location);
然后,我尝试根据请求创建另一个数组(不要对我骂人,这是许多尝试中的一个):

生成的数组应如下所示:

[courses] => array
(
  [0] => array
      (
        [name] => "course_1",
        [ages] => array
               (
                 [0] => array
                     (
                        [age] => 16,
                        [locations] => array ([0]=>"Berlin",[1]=>"London")
                      ),
                 [1] => array
                     (
                        [age] => 18,
                        [locations] => array ([0]=>"Berlin",[1]=>"Rome")
                      ),
                 [2] => array
                     (
                        [age] => 20,
                        [locations] => array ([0]=>"Berlin")
                      )

                )
       )
  [1] => array
      (
        [name] => "course_2",
        [ages] => array
               (
                 [0] => array
                     (
                        [age] => 16,
                        [locations] => array ([0]=>"Berlin")
                      )

                )
       )
);
foreach ($courses as $item) {
    $course_names[] = $item['name'];
}
$course_names = array_unique($course_names);
sort($course_names);


$finalArray = array();


foreach ($course_names as $key => $courseValue) {
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue) {
            $finalArray[$courseValue] = array();
            $finalArray[$courseValue]['id'] = $actualValue['id'];
            $finalArray[$courseValue]['ages'] = array();
        }
    }
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue) {
            if(!array_key_exists($actualValue['age'],$finalArray[$courseValue]['ages'])) {
                $finalArray[$courseValue]['ages'][$actualValue['age']] = array ();
            }

        }

    }
}

foreach ($finalArray as $course_name=>$arr) {
   foreach ($arr['ages'] as $age=>$arr2) {
        foreach($courses as $item) {
            if($item['name'] == $course_name && $item['age'] == $age && !in_array($item['location'], $finalArray[$course_name]['ages'][$age]['locations'])) {
                $finalArray[$course_name]['ages'][$age]['locations'][] = $item['location'];
            }
        }
   }
}

我为此奋斗了一段时间,我觉得自己被阻挡了,任何想法都是非常受欢迎的。

不确定你到底想要什么格式,但看看这个:

$courses = array
(
    array('id'=>1, 'name' =>"course_1",'age'=>16,'location'=>"Berlin"),
    array('id'=>2,'name'=>"course_1",'age'=>18,'location'=>"Berlin"),
    array('id'=>3,'name'=>"course_1",'age'=>20,'location'=>"Berlin"),
    array('id'=>4,'name'=>"course_1",'age'=>16,'location'=>"London"),
    array('id'=>5,'name'=>"course_1",'age'=>18,'location'=>"Rome"),
    array('id'=>6,'name'=>"course_2",'age'=>16,'location'=>"Berlin")

);

$newCourses = [];

foreach ($courses as $item){
    $newCourses[$item['name']]['ages'][$item['age']]['locations'][] = $item['location'];
}
新课程将包括:

array (
  'course_1' => 
  array (
    'ages' => 
    array (
      16 => 
      array (
        'locations' => 
        array (
          0 => 'Berlin',
          1 => 'London',
        ),
      ),
      18 => 
      array (
        'locations' => 
        array (
          0 => 'Berlin',
          1 => 'Rome',
        ),
      ),
      20 => 
      array (
        'locations' => 
        array (
          0 => 'Berlin',
        ),
      ),
    ),
  ),
  'course_2' => 
  array (
    'ages' => 
    array (
      16 => 
      array (
        'locations' => 
        array (
          0 => 'Berlin',
        ),
      ),
    ),
  ),
)

即使这不是您想要的格式,您也可以使用它来获得您想要的格式。

为了简单起见,决定修改finalArray的输出

$courses = array( 
    array("id"=>1,"name"=>"course_1","age"=>16,"location"=>"Berlin"),
    array("id"=>2,"name"=>"course_1","age"=>18,"location"=>"Berlin"),
    array("id"=>3,"name"=>"course_1","age"=>20,"location"=>"Berlin"),
    array("id"=>4,"name"=>"course_1","age"=>16,"location"=>"London"),
    array("id"=>5,"name"=>"course_1","age"=>18,"location"=>"Rome"), 
    array("id"=>6,"name"=>"course_2","age"=>16,"location"=>"Berlin"),
);

foreach ($courses as $item) {
    $course_age[]      = $item['age'];
    $course_names[]    = $item['name'];
    $course_location[] = $item['location'];
}
$course_age      = array_unique($course_age);
$course_names    = array_unique($course_names);
$course_location = array_unique($course_location);
$finalArray = array();
$finalArrayKey=0;
foreach ($course_names as $key => $courseValue) {
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue){
            $finalArray[$finalArrayKey]['name'] = $courseValue;
            $finalArray[$finalArrayKey]['ages']  = array();
            $finalArray[$finalArrayKey]['ages']['location'] = array();
        }
    }
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue){
            if(!in_array($actualValue['age'], $finalArray[$finalArrayKey]['ages']))
                $finalArray[$finalArrayKey]['ages'][]  = $actualValue['age'];
            if(!in_array($actualValue['location'], $finalArray[$finalArrayKey]['ages']['location']))
                $finalArray[$finalArrayKey]['ages']['location'][]  = $actualValue['location'];

        }
    }
    ++$finalArrayKey;
}
echo "<pre>";
print_r($finalArray);
新的finalArray将如下所示:

[courses] => array
(
  [0] => array
      (
        [name] => "course_1",
        [ages] => array
               (
                 [0] => array
                     (
                        [age] => 16,
                        [locations] => array ([0]=>"Berlin",[1]=>"London")
                      ),
                 [1] => array
                     (
                        [age] => 18,
                        [locations] => array ([0]=>"Berlin",[1]=>"Rome")
                      ),
                 [2] => array
                     (
                        [age] => 20,
                        [locations] => array ([0]=>"Berlin")
                      )

                )
       )
  [1] => array
      (
        [name] => "course_2",
        [ages] => array
               (
                 [0] => array
                     (
                        [age] => 16,
                        [locations] => array ([0]=>"Berlin")
                      )

                )
       )
);
foreach ($courses as $item) {
    $course_names[] = $item['name'];
}
$course_names = array_unique($course_names);
sort($course_names);


$finalArray = array();


foreach ($course_names as $key => $courseValue) {
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue) {
            $finalArray[$courseValue] = array();
            $finalArray[$courseValue]['id'] = $actualValue['id'];
            $finalArray[$courseValue]['ages'] = array();
        }
    }
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue) {
            if(!array_key_exists($actualValue['age'],$finalArray[$courseValue]['ages'])) {
                $finalArray[$courseValue]['ages'][$actualValue['age']] = array ();
            }

        }

    }
}

foreach ($finalArray as $course_name=>$arr) {
   foreach ($arr['ages'] as $age=>$arr2) {
        foreach($courses as $item) {
            if($item['name'] == $course_name && $item['age'] == $age && !in_array($item['location'], $finalArray[$course_name]['ages'][$age]['locations'])) {
                $finalArray[$course_name]['ages'][$age]['locations'][] = $item['location'];
            }
        }
   }
}
代码如下:


您可以显示您的代码或显示您的预期输出吗?添加了更多信息,谢谢!谢谢,以数组格式显示您的预期输出基于说明,我认为它与我刚才添加的内容类似。它将用于多选择器的表单中(选择课程,将启用年龄并仅显示可用的年龄。选择年龄将启用位置并仅显示可用的年龄)检查我的答案,其工作方式就像您需要的格式…Hi Rasa!谢谢你!输出不完全是我需要的。新转换的数组应具有具有多个位置的多个年龄的课程(课程->年龄->位置)。在您的输出中,所有年龄段都有课程的所有位置。是!!如果(!in_array($actualValue['location'],$finalArray[$finalArrayKey]['ages']['location'])你必须从这里开始工作
必须再做一些更改…不管怎样,你自己得到了答案吗?今晚我会更新我的答案!!!:-)
foreach ($courses as $item) {
    $course_names[] = $item['name'];
}
$course_names = array_unique($course_names);
sort($course_names);


$finalArray = array();


foreach ($course_names as $key => $courseValue) {
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue) {
            $finalArray[$courseValue] = array();
            $finalArray[$courseValue]['id'] = $actualValue['id'];
            $finalArray[$courseValue]['ages'] = array();
        }
    }
    foreach ($courses as $key => $actualValue) {
        if($actualValue['name']==$courseValue) {
            if(!array_key_exists($actualValue['age'],$finalArray[$courseValue]['ages'])) {
                $finalArray[$courseValue]['ages'][$actualValue['age']] = array ();
            }

        }

    }
}

foreach ($finalArray as $course_name=>$arr) {
   foreach ($arr['ages'] as $age=>$arr2) {
        foreach($courses as $item) {
            if($item['name'] == $course_name && $item['age'] == $age && !in_array($item['location'], $finalArray[$course_name]['ages'][$age]['locations'])) {
                $finalArray[$course_name]['ages'][$age]['locations'][] = $item['location'];
            }
        }
   }
}