【问题标题】:Store same type of value from array in multidimensional array in PHP?在PHP的多维数组中存储相同类型的值?
【发布时间】:2023-03-19 13:45:01
【问题描述】:

我在 php 中有一个这样的多维数组:

 Array
 (
 [0] => Array
    (
        [Year_id] => 29
        [Make_id] => 7
        [Model_id] => 34
        [Engine_id] => 19
    )

[1] => Array
    (
        [Year_id] => 30
        [Make_id] => 7
        [Model_id] => 34
        [Engine_id] => 19
    )

[2] => Array
    (
        [Year_id] => 21
        [Make_id] => 7
        [Model_id] => 34
        [Engine_id] => 19
    )

[3] => Array
    (
        [Year_id] => 1
        [Make_id] => 7
        [Model_id] => 34
        [Engine_id] => 19
    )

[4] => Array
    (
        [Year_id] => 2
        [Make_id] => 7
        [Model_id] => 34
        [Engine_id] => 2
    )

[5] => Array
    (
        [Year_id] => 3
        [Make_id] => 7
        [Model_id] => 34
        [Engine_id] => 2
    )

[6] => Array
    (
        [Year_id] => 4
        [Make_id] => 7
        [Model_id] => 34
        [Engine_id] => 2
    )

 )

我的代码如下:

  <?php
      $cars = array
      (
      array("Year_id"=>29, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
      array("Year_id"=>30, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
      array("Year_id"=>21, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
      array("Year_id"=>1, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
      array("Year_id"=>2, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2),
      array("Year_id"=>3, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2),
      array("Year_id"=>4, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2)
      );
   echo '<pre>';
   print_r($cars);
   ?>

在上面的结果中,我有四个 ID,分别命名为 Year_idMake_idModel_idEngine_idYear_id 可能随时更改,但是当任何剩余 ID 的值发生变化时,我想将这些数组存储在一个单独的数组中并再次检查剩余数组,并且当除 Year_id 之外的任何 ID 值发生更改时,将这些数组存储在单独的数组。

现在它应该将前四个数组存储在一个单独的数组中,因为Engine_id 的值发生了变化。如何解决? 2 天后我准备好接受赏金了。

【问题讨论】:

  • “两天后我准备好接受赏金了。”解释上下文
  • 你有什么不明白的?简单地说,当更改“Make_id”、“Model_id”和“Engine_id”的任何值与另一个数组进行比较时,它将相同类型的值数组存储在一个单独的二维数组中。

标签: php arrays for-loop multidimensional-array


【解决方案1】:
$i = 0;
$sepr = 0;
$arr = array();
foreach($cars as $car) {
    $k = $i; $k = ($k > 0 ? $k-1 : 0);
    foreach($car as $key => $value) {
        if($key != "Year_id" && $value != $cars[$k][$key]) {
            $sepr++;
        }
    }
    $arr[$sepr][] = $car;
    $i++;
}

print_r($arr);

【讨论】:

  • 感谢您的回答,但如何将所有这些单独的数组存储在单独的二维数组中?现在它将所有单独的数组存储在一个数组中。
  • 给我一点时间,我会解决的。
  • 已更新。应该会好一点。
【解决方案2】:

这就是我的处理方式。我会给你一个我认为相当有效的方法。你有这种形式的输入数组:

 $cars = array
  (
  array("Year_id"=>29, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
  array("Year_id"=>30, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
  array("Year_id"=>21, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
  array("Year_id"=>1, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
  array("Year_id"=>2, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2),
  array("Year_id"=>3, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2),
  array("Year_id"=>4, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2)
  );

据我了解,您并不关心“Year_id”,但如果任何其他 id 发生变化,您希望将这些元素分开。首先定义输出关联数组,我们称之为$output

所以你会这样做:

  $output = array();
  $key = $cars[0]["Make_id"].'-'.$cars[0]["Model_id"].'-'.$cars[0]["Engine_id"];
  $output[$key] = $cars[0];

让我试着解释一下我刚刚做了什么。我基本上开始为$cars 数组中的每个数组以三元组的形式索引输出数组(包含有关“Make_id”、“Model_id”和“Engine_id”的信息)。所以你可以想象$ouput 数组的索引/键是这样的:

 $output{
     ["7-34-19"]=> array("Year_id"=>29, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19)
     ...
 }

我希望您了解我的发展方向以及我现在计划如何构建输出。现在只需遍历 $cars 数组的每个元素,以我上面显示的格式连接由连字符 ('-') 分隔的三个 id,然后在 $ 中查找 that 键输出数组。如果存在,只需将其推送到该位置或创建一个新元素。

我的代码可能是这样的(未经测试):

  //Just for the sake of clarity I start from 1 here as we have already taken care of the first element
  for($i = 1; $i < count($cars); $i++) {
      $key = $cars[i]["Make_id"].'-'.$cars[i]["Model_id"].'-'.$cars[i]["Engine_id"];
      if (array_key_exists($key,$output)){
        //That means we have found another car whose make_id, model_id and engine_id match
        //Simply push that array into the associative array like so:         
        array_push($output[$key],$cars[$i]);
     }

     else{
       //We have found a unique car as the key doesn't exist, simply add it to the array
       $output[$key] = $cars[$i];
     }
   }

所以最后$output 数组可能看起来像这样:

 $output{
     ["7-34-19"]=> { 
         [0] => array("Year_id"=>29, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
         [1] => array("Year_id"=>30, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
         [2] => array("Year_id"=>21, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19),
         [3] => array("Year_id"=>1, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>19)

         } 
     ["7-34-2"]=> {
         [0] => array("Year_id"=>2, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2),
         [1] => array("Year_id"=>3, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2),
         [2] => array("Year_id"=>4, "Make_id"=>7, "Model_id"=>34, "Engine_id"=>2)  

        }
 }

我了解$output 数组的结构不是很简单,它可能会根据您最终想要实现的目标而有所不同,但它可以根据三个键在一个单个for 循环。因此该算法在时间效率上是线性的,即 O(N)

您显然不必将键与连字符组合在一起,您可以使用任何分隔符,但我们的想法是以独特的方式组合三个重要的键,并使它们成为我们输出数组的索引,这大大提高了整个算法的效率。不管怎样,我希望我能澄清我的思考过程,让你朝着正确的方向开始。

【讨论】:

  • 它对我也很有用,而且对我真的很有效。但对不起,我不会给你赏金,因为我已经宣布赏金第一人称..感谢你的努力只为我..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2013-09-04
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
相关资源
最近更新 更多