PHP数组在循环中创建多维数组

时间:2017-02-26 20:55:32

标签: php arrays multidimensional-array

我有一个关联的多维数组,如下所示

$data = array();
$data = Array ( 
    [0] => Array ( [class] => 1styear [branch] => IT [Exam] => SEM1 [student name] => Alex [Bio] => Good Boy )
    [1] => Array ( [class] => 2ndyear [branch] => Finance [Exam] => SEM1 [student name] => Mark [Bio] => Intelligent )
    [2] => Array ( [class] => 2ndyear [branch] => IT [Exam] => SEM1 [student name] => Shaun [Bio] => Football Player ) 
    [3] => Array ( [class] => 1styear [branch] => Finance [Exam] => SEM2 [student name] => Mike [Bio] => Sport Player ) 
    [4] => Array ( [class] => 1styear [branch] => IT [Exam] => SEM2 [student name] => Martin [Bio] => Smart  )
    [5] => Array ( [class] => 1styear [branch] => IT [Exam] => SEM1 [student name] => Philip [Bio] => Programmer  )
    )

我需要根据上面数组中的类似元素创建新数组。意味着我必须创建阵列组。例如,类元素具有重复的第1年和第2年的值。所以它会产生一系列独特的元素。然后,类是父数组,内部类数组应该是基于分支的数组和内部的检查数组,在Exam数组中应该有学生名和bio的关联数组。

所以基本上数组应该看起来像这样

array(
    "1styear" => array(
        "IT" => array(
            "SEM1" => array(
                array(
                    "student name" => "Alex",
                    "Bio" => "Good Boy"
                ),
                array(
                    "student name" => "Philip",
                    "Bio" => "Programmer"
                )
            ),
            "SEM2" => array(
                array(
                    "student name" => "Martin",
                    "Bio" => "Smart"
                )
            )
        )
    ),
    "2ndyear" => array(
        "Finance" => array(
            "SEM1" => array(
                array(
                    "student name" => "Mark",
                    "Bio" => "Intelligent"
                )
            ),
            "SEM2" => array(
                array(
                    "student name" => "Mike",
                    "Bio" => "Sport Player"
                )
            )
        )
    )
);

基于类我做的组我喜欢下面哪个工作正常但是如何在

中创建数组
$classgroup = array();  
    foreach($data as $inarray){

         $classgroup[$inarray['class']][] = $inarray;
    }
    $classarray = array();
    foreach($classgroup as $key => $value){
            echo $key; // output is 1styear and secondyear 
            create array like above
    }

--------------------------------- EDIT ---------- ------------------------

来自以下循环

foreach($data as $array){
        $grouped[$array["class"]][$array["branch"]][$array["Exam"]][]=array("student name"=>$array["student name"],"Bio"=>$array["Bio"]);
} 

我得到了预期的o / p 但如果我需要另一个这样的o / p

预期o / p

array(
    '1styear' =>
        array (
            0 =>
                array(
                    'Exam' => 'SEM1',
                    'branch' =>
                        array (
                            0 => 'IT'
                        ),
                ),
            1 =>
                array(
                    'Exam' => 'SEM2',
                    'branch' =>
                        array (
                            0 => 'IT'
                        ),
                ),
        ),
    '2ndyear' =>
        array (
            0 =>
                array(
                    'Exam' => 'SEM1',
                    'branch' =>
                        array (
                            0 => 'Finance',
                        ),
                ),
            1 =>
                array(
                    'Exam' => 'SEM2',
                    'branch' =>
                        array (
                            0 => 'Finance'
                        ),
                )
        ),
)

我尝试了循环但没有按预期获得o / p

foreach($data as $array){
        $grouped[$array["class"]][]=array("Exam"=>$array["Exam"],"branch"=>$array["branch"]);
}

2 个答案:

答案 0 :(得分:1)

循环中的单行!

$grouped

Array( [1styear] => Array( [IT] => Array( [SEM1] => array( [0] => array( [student name] => Alex, [Bio] => Good Boy ), [1] => array( [student name] => Philip, [Bio] => Programmer ) ), [SEM2] => array( [0] => array( [student name] => Martin, [Bio] => Smart ) ) ), [Finance] => array( [SEM2] => array( [0] => array( [student name] => Mike, [Bio] => Sport Player ) ) ) ), [2ndyear] => array( [Finance] => array( [SEM1] => array( [0] => array( [student name] => Mark, [Bio] => Intelligent ) ) ), [IT] => array( [SEM1] => array( [0] => array( [student name] => Shaun, [Bio] => Football Player ) ) ) ) ) 产生:

<?php
$data = array ( 
    array ( "class"=>"1styear","branch"=>"IT","Exam"=>"SEM1","student name"=>"Alex","Bio"=>"Good Boy"),
    array ( "class"=>"2ndyear","branch"=>"Finance","Exam"=>"SEM1","student name"=>"Mark","Bio"=>"Intelligent" ),
    array ( "class"=>"2ndyear", "branch"=>"IT","Exam"=>"SEM1","student name"=>"Shaun","Bio"=>"Football Player" ), 
    array ( "class"=>"1styear","branch"=>"Finance","Exam"=>"SEM2","student name"=>"Mike","Bio"=>"Sport Player" ), 
    array ( "class"=>"1styear","branch"=>"IT","Exam"=>"SEM2","student name"=>"Martin","Bio"=>"Smart"),
    array ( "class"=>"1styear","branch"=>"IT","Exam"=>"SEM1","student name"=>"Philip","Bio"=>"Programmer"  )
);
$class_keys=array_unique(array_column($data,"class"));  // create array of unique class values
$Exam_keys=array_unique(array_column($data,"Exam"));  // create array of unique Exam values
foreach($class_keys as $class_key){
    $i=0;  // "class" subarray index
    foreach($Exam_keys as $Exam_key){
        $q=array("class"=>$class_key,"Exam"=>$Exam_key);  // this array can have 1 or more pairs
        // create an array only of rows where $q's key-value pairs exist
        $qualifying_array=array_filter(
            $data,
            function($val)use($q){  
                if(count(array_intersect_assoc($val,$q))==count($q)){  // total pairs found = total pairs sought
                    return $val;
                }
            },
            ARRAY_FILTER_USE_BOTH
        );
        foreach($qualifying_array as $qa){  // push appropriate values into array
            $grouped2[$class_key][$i]["Exam"]=$qa["Exam"];
            $grouped2[$class_key][$i]["branch"][]=$qa["branch"];
        }
        if(isset($grouped2[$class_key][$i]["branch"])){  // ensure no duplicate values in "branch" subarray
            $grouped2[$class_key][$i]["branch"]=array_unique($grouped2[$class_key][$i]["branch"]);
        }
        ++$i;  // increment the index for each "class" subarray
    }
}
echo "<pre>";
print_r($grouped2);
echo "</pre>";

您的跟进案例,更有趣/更具挑战性。我不得不把我不经常玩的一些功能搞得粉碎。看看这个:

array(
    [1styear]=>array(
        [0]=>array(
            [Exam]=>SEM1
            [branch]=>array(
                [0]=>IT
            )
        ),
        [1]=>array(
            [Exam]=>SEM2
            [branch]=>array(
                [0]=>Finance,
                [1]=>IT
            )
        )
    ),
    [2ndyear]=>array(
        [0]=>array(
            [Exam]=>SEM1
            [branch]=>array(
                [0]=>Finance,
                [1]=>IT
            )
        )
    )
)

输出与您要求的输出不同,但我认为您只是展示它应该是什么样子。如果这不太对,请告诉我。

 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />   
    <property name="ignoreUnresolvablePlaceholders" value="true" />   
 </bean>    

<bean id="redisClusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
    <property name="clusterNodes">
        <list>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value= "${HOST}"/>
                <constructor-arg name="port" value="${PORT}"/>
            </bean>
        </list>
    </property>
</bean>

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
      destroy-method="destroy">
    <constructor-arg name="clusterConfig" ref="redisClusterConfig"/>
</bean>


<!-- redis template definition -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
     <property name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>

答案 1 :(得分:0)

也许是这样的(没有经过测试)?

$newData = [];

foreach ($data as $row) {
   $student = [
      'student name' => $row['student name'],
      'Bio' => $row['Bio']
   ];
   $newData[$row['class']][$row['branch']][$row['exam']][] = $student;
}