【问题标题】:Split an array into two arrays based on identical values根据相同的值将数组拆分为两个数组
【发布时间】:2018-03-15 12:49:57
【问题描述】:

我有这个数组:

$arrayAll = [
  '156' => '1',
  '157' => '1',
  '158' => '2',
  '159' => '1',
  '160' => '2',
  '161' => '1'
];

键是唯一的——它们永远不会重复。该值可以是 1 或 2 - 仅此而已。

我需要将这个 $arrayAll 数组“拆分”为 $array1 - 将包含值为 1 的所有内容和 $array2 - 将包含值为 2 的所有内容,所以最后我将拥有:

$array1 = [
  '156' => '1',
  '157' => '1',
  '159' => '1',
  '161' => '1'
];

$array2 = [
  '158' => '2',
  '160' => '2'
];

如您所见,我将保留原始数组中的键。

像这样分离原始数组最简单的方法是什么?

【问题讨论】:

  • 伙计们,到目前为止,您的所有解决方案都太复杂了,有一种更简单的方法可以做到这一点。
  • 然后将其发布为答案。这就是 SO 的用途。

标签: php arrays


【解决方案1】:

这可能是最简单的方法了。
循环它并创建一个临时数组来保存值,然后将值提取到数组 1 和 2。

Foreach($arrayAll as $k => $v){
    $res["array" . $v][$k] = $v;
}
Extract($res);

Var_dump($array1, $array2);

https://3v4l.org/6en6l

更新为使用提取和可变变量的方法。
更新意味着即使输入数组中有值“3”,它也会起作用。

https://3v4l.org/jbvBf

【讨论】:

  • 你很接近,但还有更简单的方法;)
  • 请告诉我。我很震惊。可能是什么?
【解决方案2】:

使用foreach 并比较每个值并将其分配给一个新数组。

$array1 = [];
$array2 = [];
foreach($arrayAll as $key=>$val){
    if($val == 2){
        $array2[$key] = $val;
    }else{
        $array1[$key] = $val;
    }
}
print_r($array1);
print_r($array2);

Demo

【讨论】:

    【解决方案3】:

    最简单的做法是使用foreach loop

    $array = [
      '156' => '1',
      '157' => '1',
      '158' => '2',
      '159' => '1',
      '160' => '2',
      '161' => '1'
    ];
    
    $array1 = [];
    $array2 = [];
    
    foreach ($array as $key => $value)
        // If value is 1, add to array1
        // If value is not 1, add value to array2
        if ($value === '1')
            $array1[$key] = $value;
        else
            $array2[$key] = $value;
    
    
    echo var_dump($array1);
    echo '<br>';
    echo var_dump($array2);
    

    【讨论】:

      【解决方案4】:

      使用间接引用:

      $arrayAll = array("156"=>"1", "157"=>"1", "158"=>"2", "159"=>"1", "160"=>"2", "161"=>"1");
      
      foreach($arrayAll as $key=>$value) {
                $name = "array".$value;
                $$name[$key] = $value;
      }
      
      echo "<pre>";
      print_r($array1);
      print_r($array2);
      echo "</pre>";
      

      【讨论】:

      • 为什么是开关盒?没有它,代码也可以工作:3v4l.org/QQSJo $i 在代码中做了什么?
      【解决方案5】:
      //your array
      $yourArray = [
        '156' => '1',
        '157' => '1',
        '158' => '2',
        '159' => '1',
        '160' => '2',
        '161' => '1'
      ];
      

      您提到的条件只是构建两个数组,您可以将array_keys与接受搜索值的第二个参数一起使用

       $array1 = array_keys($yourArray, '1');
       $array2 = array_keys($yourArray, '2');
      

      如果您不想使用 array_keys,请进行迭代

      $array1 = array();
      $array2 = array();
      
      foreach($yourArray as $key=>$value){
         //will always be 1 or 2, so an if-else is enought
         if($value == 1){
            $array1[] = $key;
         } else {
            $array2[] = $key;
         }
      }
      

      就是这样。

      检查this link 的array_keys

      如果您有超过 2 个值,以下将起作用,并且可以在其他情况下重复使用

      您想根据值对它们进行分组

      $arrayOfValues = array_values($yourArray);
      //this returns only the values of the array
      $arrayOfUniqueValues = array_unique($arrayOfValues);
      //this returns an array with the unique values, also with this u consider
      //the posibility for more different values 
      //also u can get the unique values array on a single line
      $arrayIfUniqueValues = array_unique(array_values($yourArray));
      

      你要返回的数组

      $theReturn = array();
      foreach($arrayOfUniqueValues as $value ){
          //what does this do?
          //for each iteration it creates a key in your return array "$theReturn"
          //and that one is always equal to the $value of one of the "Unique Values"
          //array_keys return the keys of an array, and with the second parameter
          //it acceps a search parameter, so the keys it return are the ones
          //that matches the value, so here u are getting the array already made
          $theReturn[$value] = array_keys($yourArray, $value);
      
      }
      

      在这种情况下,var_dump 将如下所示

      array(2) {
        [1]=>
          array(4) {
            [0]=>
            int(156)
            [1]=>
            int(157)
            [2]=>
            int(159)
            [3]=>
            int(161)
        }
           [2]=>
           array(2) {
              [0]=>
              int(158)
              [1]=>
              int(160)
          }
      }
      

      希望我的回答对您有所帮助,我尝试从最短/最简单的开始组织解决方案。

      编辑: 我忘了你也需要键值,至少在这个解决方案中,数组总是引用值,比如 $array1, $array2$key 引用值,就像上一个解决方案中一样

      【讨论】:

        【解决方案6】:

        根据值将数组分成其他数组的最简单解决方案包括:

        1. 使用array_unique 获取其唯一值。
        2. 使用 foreach 循环遍历这些值。
        3. 使用array_intersect获取与当前值相交的键值对。

        代码:

        # Iterate over every value and intersect it with the original array.
        foreach(array_unique($arrayAll) as $v) ${"array$v"} = array_intersect($arrayAll, [$v]);
        

        优势:

        与其他给定答案相比,此答案的优势在于它使用array_unique 来查找唯一值,因此仅迭代两次而不是n 次。

        查看现场演示 here

        【讨论】:

        • 如果反对者提供了他们采取行动的理由,我将不胜感激 ?
        • 这有点奇怪,我的回答也一样
        • 确实是@FranciscoHahn。该线程中的几乎每个答案都被否决了,没有任何解释......
        • 我怀疑是 OP
        猜你喜欢
        • 2013-12-04
        • 2018-06-17
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 2011-06-15
        • 1970-01-01
        相关资源
        最近更新 更多