根据值合并数组的键
Merge keys of an array based on values
我想根据值合并数组的键。这是我的数组。
Array
(
[1] => 1
[2] => 1
[3] => 1
[4] => 2
[5] => 0
[6] => 2
[7] => 2
)
我想要输出为
Array
(
[1,2,3] => 1
[4,6,7] => 2
[5] => 0
)
我整天都在头脑风暴,但找不到解决方案。任何提示将不胜感激。
我尝试了什么:
for($i=2;$i<=count($new);$i++){
if ($new[$i-1][1]==$new[$i][1]){
$same .= $new[$i-1][0].$new[$i][0];
}
}
echo $same;
但是我卡住了。我正在一个一个地比较键,但它非常复杂。我不需要代码。我只需要提示或逻辑。有好心人吗?
您可以遍历数组元素并创建具有新结构的新数组。请检查以下代码,它可能对您有所帮助
$old_array = array(1=> 1,2 => 1,
3=> 1,
4 => 2,
5 => 0,
6 => 2,
7 => 2
);
$new_array = array();
foreach($old_array as $key => $value)
{
if(in_array($value,$new_array))
{
$key_new = array_search($value, $new_array);//to get the key of element
unset($new_array[$key_new]); //remove the element
$key_new = $key_new.','.$key; //updating the key
$new_array[$key_new] = $value; //inserting new element to the key
}
else
{
$new_array[$key] = $value;
}
}
print_r($new_array);
<?php
$old_arr = ["1"=>1,"2"=>1,"3"=>1,"4"=>2,"5"=>0,"6"=>2,"7"=>2];
$tmp = array();
foreach($old_arr as $key=>$value)
{
if(in_array($value, $tmp)){
$index = array_search($value, $tmp);
unset($tmp[$index]);
$tmp[$index.",".$key] = $value;
}else{
$tmp[$key] = $value;
}
}
ksort($tmp);
echo "<pre>";
print_r($tmp);
echo "</pre>";
?>
$arr = array(1 => 1, 2 => 1, 3 => 1, 4 => 2, 5 => 0, 6 => 2, 7 => 2);
$tmp = array();
foreach ($arr as $key => $val)
$tmp[$val][] = $key;
$new = array();
foreach ($tmp as $key => $val)
$new[implode(',', $val)] = $key;
首先循环遍历原始数组,创建一个临时数组,其中原始值是键,值是作为数组的原始键。
然后循环临时数组,创建新数组,其中临时数组的值作为键内爆。
无法将一组键设置为单个值,但反过来:
function flipWithKeyArray($arr){
$result = array();
foreach($arr as $key => $val){
if(!isset($result[$val]))
$result[$val] = array();
$result[$val][] = $key;
}
return $result;
}
这将翻转您的数组并为旧数组的每个值声明一个数组,然后将具有相同值的键推送到每个列表中。
对于这样的数组:
array(1=>1, 2=>1, 3=>1, 4=>2, 5=>2, 6=>2)
结果将如下所示:
array(1=>array(1,2,3), 2=>array(4,5,6))
希望它能满足您的需要。
我想根据值合并数组的键。这是我的数组。
Array
(
[1] => 1
[2] => 1
[3] => 1
[4] => 2
[5] => 0
[6] => 2
[7] => 2
)
我想要输出为
Array
(
[1,2,3] => 1
[4,6,7] => 2
[5] => 0
)
我整天都在头脑风暴,但找不到解决方案。任何提示将不胜感激。
我尝试了什么:
for($i=2;$i<=count($new);$i++){
if ($new[$i-1][1]==$new[$i][1]){
$same .= $new[$i-1][0].$new[$i][0];
}
}
echo $same;
但是我卡住了。我正在一个一个地比较键,但它非常复杂。我不需要代码。我只需要提示或逻辑。有好心人吗?
您可以遍历数组元素并创建具有新结构的新数组。请检查以下代码,它可能对您有所帮助
$old_array = array(1=> 1,2 => 1,
3=> 1,
4 => 2,
5 => 0,
6 => 2,
7 => 2
);
$new_array = array();
foreach($old_array as $key => $value)
{
if(in_array($value,$new_array))
{
$key_new = array_search($value, $new_array);//to get the key of element
unset($new_array[$key_new]); //remove the element
$key_new = $key_new.','.$key; //updating the key
$new_array[$key_new] = $value; //inserting new element to the key
}
else
{
$new_array[$key] = $value;
}
}
print_r($new_array);
<?php
$old_arr = ["1"=>1,"2"=>1,"3"=>1,"4"=>2,"5"=>0,"6"=>2,"7"=>2];
$tmp = array();
foreach($old_arr as $key=>$value)
{
if(in_array($value, $tmp)){
$index = array_search($value, $tmp);
unset($tmp[$index]);
$tmp[$index.",".$key] = $value;
}else{
$tmp[$key] = $value;
}
}
ksort($tmp);
echo "<pre>";
print_r($tmp);
echo "</pre>";
?>
$arr = array(1 => 1, 2 => 1, 3 => 1, 4 => 2, 5 => 0, 6 => 2, 7 => 2);
$tmp = array();
foreach ($arr as $key => $val)
$tmp[$val][] = $key;
$new = array();
foreach ($tmp as $key => $val)
$new[implode(',', $val)] = $key;
首先循环遍历原始数组,创建一个临时数组,其中原始值是键,值是作为数组的原始键。
然后循环临时数组,创建新数组,其中临时数组的值作为键内爆。
无法将一组键设置为单个值,但反过来:
function flipWithKeyArray($arr){
$result = array();
foreach($arr as $key => $val){
if(!isset($result[$val]))
$result[$val] = array();
$result[$val][] = $key;
}
return $result;
}
这将翻转您的数组并为旧数组的每个值声明一个数组,然后将具有相同值的键推送到每个列表中。
对于这样的数组:
array(1=>1, 2=>1, 3=>1, 4=>2, 5=>2, 6=>2)
结果将如下所示:
array(1=>array(1,2,3), 2=>array(4,5,6))
希望它能满足您的需要。