【问题标题】:Merge keys of an array based on values根据值合并数组的键
【发布时间】:2016-03-03 12:03:55
【问题描述】:

我想根据值合并数组的键。这是我的数组。

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;

但我被困住了。我正在一一比较键,但这非常复杂。我不需要代码。我只需要提示或逻辑。有好心人吗?

【问题讨论】:

标签: php arrays array-merge


【解决方案1】:
<?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>";
?>

https://eval.in/529314

【讨论】:

  • 这是有效的,但你看到我的数组结构与你的不同。
  • @AliZia 你的意思是双引号?
【解决方案2】:

您可以循环遍历数组元素并创建具有新结构的新数组。请检查下面的代码它可能对你有帮助

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

【讨论】:

    【解决方案3】:
    $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;
    

    首先循环原始数组,创建一个临时数组,其中您的原始值是键,值是原始键作为数组。

    然后循环临时数组,创建新数组,其中临时数组的值作为键内爆。

    【讨论】:

      【解决方案4】:

      没有办法让一个键的数组指向一个值,但反过来:

      function flipWithKeyArray($arr){
        $result = array();
        foreach($arr as $key => $val){
          if(!isset($result[$val]))
            $result[$val] = array();
          $result[$val][] = $key;
        }
        return $result;
      }
      

      这将翻转您的数组并为旧数组的每个值声明一个数组,然后将具有相同值的键推送到每个列表中。

      对于这样的数组:
      array(1=&gt;1, 2=&gt;1, 3=&gt;1, 4=&gt;2, 5=&gt;2, 6=&gt;2)
      结果将如下所示:
      array(1=&gt;array(1,2,3), 2=&gt;array(4,5,6))

      希望它符合您的需要。

      【讨论】:

        猜你喜欢
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 2015-02-03
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多