我有这个数组:
$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'
];
正如您所看到的,我将使原始数组中的键保持不变。
像这样分离原始数组最简单的做法是什么?
答案 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);
答案 1 :(得分:0)
这可能是最简单的方法 循环它并创建一个临时数组来保存值,然后将值提取到数组1和2.
Foreach($arrayAll as $k => $v){
$res["array" . $v][$k] = $v;
}
Extract($res);
Var_dump($array1, $array2);
更新为使用提取和变量变量的方法 更新意味着即使存在值" 3"在输入数组中。
答案 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)
根据值将数组分离到其他数组的最简单方法包括:
array_unique
获取其唯一值。foreach
循环使用这些值。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。