【问题标题】:How to change multidimensional array comparing with another multidimensional array and get the results according to user defined如何更改多维数组与另一个多维数组比较并根据用户定义获得结果
【发布时间】:2020-01-09 10:17:09
【问题描述】:

这是我的第一个数组

$array1 = Array
(
    [0] => Array
        (
            [class] => Nursery
            [subjects] => Array
                (
                    [0] => dance
                    [1] => Drawing
                    [2] => English
                    [3] => Hindi
                    [4] => Maths
                    [5] => Painting
                    [6] => Reading & Writing

                )

        )

    [1] => Array
        (
            [class] => Kg
            [subjects] => Array
                (
                    [0] => Drawing
                    [1] => English
                    [2] => Hindi
                    [3] => Painting
                    [4] => Personality Development
                )

        )

    [2] => Array
        (
            [class] => 1st
            [subjects] => Array
                (
                    [0] => Art & Craft
                    [1] => Computer
                    [2] => Drawing
                    [3] => English
                    [4] => Environmental Education
                    [5] => French
                    [6] => hand writing
                    [7] => Hindi
                    [8] => Maths
                    [9] => Moral Teaching
                    [10] => music
                    [11] => Painting
                    [12] => Spoken English
                )

        )

);

第二个数组是

$array2 = Array
(
    [0] => Array
        (
            [class] => Kg
            [subjects] => Array
                (
                    [0] => English
                    [1] => Hindi
                )

        )

    [1] => Array
        (
            [class] => 1st
            [subjects] => Array
                (
                    [0] => English
                    [1] => Environmental Education
                    [2] => French
                )

        )


);

我想要的输出如下所示

$output = Array
(
    [0] => Array
        (
            [classname] => Nursery
            [ischeck] => No
            [subs] => Array
                (
                    [0] => Array
                        (
                            [subjects] => dance
                            [ischeck] => No
                        )

                    [1] => Array
                        (
                            [subjects] => Drawing
                            [ischeck] => No
                        )

                    [2] => Array
                        (
                            [subjects] => English
                            [ischeck] => No
                        )

                    [3] => Array
                        (
                            [subjects] => Hindi
                            [ischeck] => No
                        )

                    [4] => Array
                        (
                            [subjects] => Maths
                            [ischeck] => No
                        )

                    [5] => Array
                        (
                            [subjects] => Painting
                            [ischeck] => No
                        )

                    [6] => Array
                        (
                            [subjects] => Reading & Writing

                            [ischeck] => No
                        )

                )

        )
         [1] => Array
        (
            [classname] => Kg
            [ischeck] => Yes
            [subs] => Array
                (
                    [0] => Array
                        (
                            [subjects] => Drawing
                            [ischeck] => No
                        )

                    [1] => Array
                        (
                            [subjects] => English
                            [ischeck] => Yes
                        )

                    [2] => Array
                        (
                            [subjects] => Hindi
                            [ischeck] => Yes
                        )

                    [3] => Array
                        (
                            [subjects] => Painting
                            [ischeck] => No
                        )

                    [4] => Array
                        (
                            [subjects] => Personality Development
                            [ischeck] => No
                        )

                )

        )
        [2] => Array
        (
            [classname] => 1st
            [ischeck] => Yes
            [subs] => Array
                (
                    [0] => Array
                        (
                            [subjects] => Art & Craft
                            [ischeck] => No
                        )

                    [1] => Array
                        (
                            [subjects] => Computer
                            [ischeck] => No
                        )

                    [2] => Array
                        (
                            [subjects] => Drawing
                            [ischeck] => No
                        )

                    [3] => Array
                        (
                            [subjects] => English
                            [ischeck] => Yes
                        )

                    [4] => Array
                        (
                            [subjects] => Environmental Education
                            [ischeck] => yes
                        )

                    [5] => Array
                        (
                            [subjects] => French
                            [ischeck] => Yes
                        )

                    [6] => Array
                        (
                            [subjects] => hand writing
                            [ischeck] => No
                        )

                    [7] => Array
                        (
                            [subjects] => Hindi
                            [ischeck] => No
                        )

                    [8] => Array
                        (
                            [subjects] => Maths
                            [ischeck] => No
                        )

                    [9] => Array
                        (
                            [subjects] => Moral Teaching
                            [ischeck] => No
                        )

                    [10] => Array
                        (
                            [subjects] => music
                            [ischeck] => No
                        )

                    [11] => Array
                        (
                            [subjects] => Painting
                            [ischeck] => No
                        )

                    [12] => Array
                        (
                            [subjects] => Spoken English
                            [ischeck] => No
                        )

                )

        )
    )

到目前为止我已经尝试过什么

$full_array = array();
    foreach($array1 as $k)
    {
         $subarray = array();
        foreach($array2 as $k1)
        {

            if($k['class'] == $k1['class'])
            {
                $classname = $k['class'];

                foreach($k['subjects'] as $s)
                {
                    if(in_array($s,$k1['subjects']))
                    {
                        $sub = array("subjects"=>$s,"ischeck"=>"Yes");
                    }
                    else
                    {
                        $sub = array("subjects"=>$s,"ischeck"=>"No");
                    }
                   array_push($subarray,$sub);
                   $ot1 = array("classname"=>$classname,"subs"=>$subarray);
                   array_push($full_array,$ot1);
                }

            }
            else
            {
                $cname = $k['class'];
                foreach($k['subjects'] as $sb=>$v)
                {
                    $sub = array("subjects"=>$v,"ischeck"=>"No");
                    array_push($subarray,$sub);
                }

                $ot2 = array("classname"=>$cname,"subs"=>$subarray);
                array_push($full_array,$ot2);

            }
        }
    }
    return $full_array;

如果第一个数组的类别为 kg,第二个数组的类别为 kg,那么在新数组中它应该添加一个新选项 ischeck Yes,并且对于与 array1 和 array2 比较的主题也相同,它应该在输出数组上添加 ischeck,如果主题存在于array2中,那么它应该在主题列之后的输出数组中添加ischeck。

【问题讨论】:

  • 另外,您是否通过查询数据库获得所有这些数组?
  • 是的,我从两个不同的表中获取它们,我只是希望它们在另一个数组中分开,这样我就可以显示检查了哪些课程和科目
  • 通过循环可以创建一个符合您要求的数组。但这不是一个优化的解决方案。尝试从查询本身获取正确格式的数据。不要去不必要的循环
  • 第二个数组可以是任意顺序,我希望按照第一个数组的顺序输出
  • @satya 你不需要在应用层做这一切,编写一个可以带来所需输出的查询,然后在应用层上使用该结果。

标签: php arrays multidimensional-array


【解决方案1】:

如果您从查询中获取数组并在关联数组中获取数据(如果可能),其中类应该是键,主题应该是值。

你的数组1:

$array1 = [
[
    'class' => 'Nursery', 
    'subjects' => [
        'dance',
        'Drawing',
        'English',
        'Hindi',
        'Maths',
        'Painting',
        'Reading & Writing',
    ]
],
[
    'class' => 'Kg', 
    'subjects' => [
        'English',
        'Drawing',
        'Hindi',
        'Painting',
        'Personality Development',
    ]
],
[
    'class' => '1st', 
    'subjects' => [
        'Art & Craft',
        'Drawing',
        'Computer',
        'Environmental Education',
        'English',
        'French',
        'hand writing',
        'Hindi',
        'Maths',
        'music',
        'Painting',
        'Moral Teaching',
        'Spoken English',
    ]
]

];

你的数组2:

$array2 = [
[
    'class' => 'Kg', 
    'subjects' => [
        'Hindi',
        'English',

    ]
],
[
    'class' => '1st', 
    'subjects' => [
        'English',
        'French',
        'Environmental Education',
    ]
]

];

用下面的代码试试:

// Make an associave array of $array2 if couln'd make it from db query..
$class2 = array_column($array2, 'class');
$sub2 = array_column($array2, 'subjects');
$new_a2 = array_combine($class2, $sub2);

foreach ($array1 as $key => $a1) {
    $subs_final = [];
    // Make an associave array of $array1 if couln'd make it from db query.
    $new_a[$a1['class']] = $a1['subjects'];
    // Prepare output.
    $output[$key] = [
        'classname' => $a1['class'],
        'ischeck' => (in_array($a1['class'], $class2)? 'Yes' : 'No'),
        ];
    foreach ($a1['subjects'] as $key2 => $subject) {
        $subs_final[] = [
                'subjects' => $subject,
                'ischeck' => (isset($new_a2[$a1['class']]) && in_array($subject, $new_a2[$a1['class']])? 'Yes' : 'No'),
            ];
    }
    $output[$key]['subs'] = $subs_final;
}
echo "<pre>"; print_r($output); die();

它甚至可以在一个循环中完成,为此,您需要深入研究数组函数。但现在,试试这个。

这是输出:

Array
(
    [0] => Array
        (
            [classname] => Nursery
            [ischeck] => No
            [subs] => Array
                (
                    [0] => Array
                        (
                            [subjects] => dance
                            [ischeck] => No
                        )

                    [1] => Array
                        (
                            [subjects] => Drawing
                            [ischeck] => No
                        )

                    [2] => Array
                        (
                            [subjects] => English
                            [ischeck] => No
                        )

                    [3] => Array
                        (
                            [subjects] => Hindi
                            [ischeck] => No
                        )

                    [4] => Array
                        (
                            [subjects] => Maths
                            [ischeck] => No
                        )

                    [5] => Array
                        (
                            [subjects] => Painting
                            [ischeck] => No
                        )

                    [6] => Array
                        (
                            [subjects] => Reading & Writing
                            [ischeck] => No
                        )

                )

        )

    [1] => Array
        (
            [classname] => Kg
            [ischeck] => Yes
            [subs] => Array
                (
                    [0] => Array
                        (
                            [subjects] => English
                            [ischeck] => Yes
                        )

                    [1] => Array
                        (
                            [subjects] => Drawing
                            [ischeck] => No
                        )

                    [2] => Array
                        (
                            [subjects] => Hindi
                            [ischeck] => Yes
                        )

                    [3] => Array
                        (
                            [subjects] => Painting
                            [ischeck] => No
                        )

                    [4] => Array
                        (
                            [subjects] => Personality Development
                            [ischeck] => No
                        )

                )

        )

    [2] => Array
        (
            [classname] => 1st
            [ischeck] => Yes
            [subs] => Array
                (
                    [0] => Array
                        (
                            [subjects] => Art & Craft
                            [ischeck] => No
                        )

                    [1] => Array
                        (
                            [subjects] => Drawing
                            [ischeck] => No
                        )

                    [2] => Array
                        (
                            [subjects] => Computer
                            [ischeck] => No
                        )

                    [3] => Array
                        (
                            [subjects] => Environmental Education
                            [ischeck] => Yes
                        )

                    [4] => Array
                        (
                            [subjects] => English
                            [ischeck] => Yes
                        )

                    [5] => Array
                        (
                            [subjects] => French
                            [ischeck] => Yes
                        )

                    [6] => Array
                        (
                            [subjects] => hand writing
                            [ischeck] => No
                        )

                    [7] => Array
                        (
                            [subjects] => Hindi
                            [ischeck] => No
                        )

                    [8] => Array
                        (
                            [subjects] => Maths
                            [ischeck] => No
                        )

                    [9] => Array
                        (
                            [subjects] => music
                            [ischeck] => No
                        )

                    [10] => Array
                        (
                            [subjects] => Painting
                            [ischeck] => No
                        )

                    [11] => Array
                        (
                            [subjects] => Moral Teaching
                            [ischeck] => No
                        )

                    [12] => Array
                        (
                            [subjects] => Spoken English
                            [ischeck] => No
                        )

                )

        )

)

【讨论】:

【解决方案2】:

首先我通过使用数组列得到了array2中的所有类名

$chosen_class= array_column($array2,"class");

然后我用 classname 和 ischeck 以及 array1 的所有主题创建了另一个数组子类

   $subclass = array();
    foreach($array1 as $k)
    {
        if(in_array($k['class'],$chosen_class)){
          $a1 = array("classname"=>$k['class'],"ischeck"=>"Yes","subs"=>$k['subjects']);
          array_push($subclass,$a1);    
        }
        else
        {
            $a1 = array("classname"=>$k['class'],"ischeck"=>"No","subs"=>$k['subjects']);
          array_push($subclass,$a1);    
        }

    } 

之后,我为 $subclass 数组应用了 foreach 循环并检查了这个循环是否有 ischeck yes 然后我为 array2 的主题应用了 foreach 循环并将这个数组放入另一个数组中,然后我得到了 array1 主题和 array2 主题之间的数组差异,现在我已经得到了那些在 array2 中显示的主题,而在 array1 中没有显示的主题,然后我用 ischeck yes 和 ischeck no 将它们推到另一个数组中,然后我得到了完整的输出

这是我的最终代码

$fulloutput = array();

   foreach($subclass as $sb)
   {
       $cls = $sb['classname'];
       $ischeck = $sb['ischeck'];
       $sbarray = array(); 
       $sbarray2 = array();
       if($sb['ischeck']=='Yes')
       {
           foreach($array1 as $sb1)
           {
               if($sb1['class']==$sb['classname'])
               {
                   $sbarray = $sb1['subjects'];
               }
           }
       }

       $diff = array_diff($sb['subs'],$sbarray);
       foreach($diff as $d=>$v)
       {
           $sb2 = array('subs'=>$v,'ischeck'=>'No');
           array_push($sbarray2,$sb2);
       }
       foreach($sbarray as $d=>$v)
       {
           $sb2 = array('subs'=>$v,'ischeck'=>'Yes');
           array_push($sbarray2,$sb2);
       }
       $ft = array("classname"=>$cls,"ischeck"=>$ischeck,"subs"=>$sbarray2);
       array_push($fulloutput,$ft);
   }
   return $fulloutput;

【讨论】:

    【解决方案3】:

    为了简单明了,我将您的第一个数组称为$all,将第二个数组称为$selected

    前面的两个答案都足够聪明,知道可以通过修改 $selected 数组来提高性能。然而,他们在准备数据方面只进行了一半。为了获得最佳性能,应避免使用in_array(),更糟糕的是重复调用in_array()。最好的做法是将您的 $selected 数组准备为完全关联的数组,并允许 php 通过专门引用键来快速检查 hashmap(isset()in_array() 更有效)。换句话说,检查键总是比检查值快。我不需要做任何新的基准测试来支持这种说法。

    Demonstration

    1. 准备查找:

      foreach ($selected as $class) {
          $selectedLookup[$class['class']] = array_flip($class['subjects']);
      }
      var_export($selectedLookup);
      
      • $selectedLookup 现在包含(这些值不相关/未使用下标):

        array (
          'Kg' => 
          array (
            'Hindi' => 0,
            'English' => 1,
          ),
          '1st' => 
          array (
            'English' => 0,
            'French' => 1,
            'Environmental Education' => 2,
          ),
        )
        
    2. 用最少的循环和迭代的函数调用生成所需的结果:

      foreach ($all as $class) {
          $classname = $class['class'];    
          $result[$classname] = [
              'classname' => $classname,
              'ischeck' => 'No',
          ];
          foreach ($class['subjects'] as $subject) {
              if (isset($selectedLookup[$classname][$subject])) {
                  $check = 'Yes';
                  $result[$classname]['ischeck'] = $check;
              } else {
                  $check = 'No';
              }
              $result[$classname]['subs'][] = [
                  'subject' => $subject,
                  'ischeck' => $check,
              ];
          }
      }
      var_export(array_values($result));
      

      此步骤通过指定临时一级关联键 ($result[$classname]) 来声明新数据。完成迭代后,如果需要,通过在结果数组上调用 array_values() 来删除临时键。

    因为在结果生成步骤中只有两个循环并且只有 isset() 的迭代调用,所以即使不是不可能,也很难找到更快的任务执行。

    如果这是我的应用程序,我可能倾向于将“父”ischeck 键声明为 hasCheck——因为我认为它会提高人类的理解力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2020-05-30
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多