根据相同的值将数组拆分为两个数组

时间:2018-03-15 12:49:57

标签: php arrays

我有这个数组:

$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'
];

正如您所看到的,我将使原始数组中的键保持不变。

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

6 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

这可能是最简单的方法 循环它并创建一个临时数组来保存值,然后将值提取到数组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 :(得分:-1)

最简单的方法是使用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);

答案 3 :(得分:-1)

使用间接参考:

$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>";

答案 4 :(得分:-1)

//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对值的引用,如上一个解决方案

答案 5 :(得分:-1)

根据值将数组分离到其他数组的最简单方法包括:

  1. 使用array_unique获取其唯一值。
  2. 使用foreach循环使用这些值。
  3. 使用array_intersect获取与当前值相交的键值对。
  4. <强>代码:

    # 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