【问题标题】:PHP Associative Array Duplicate KeysPHP关联数组重复键
【发布时间】:2023-03-15 00:44:01
【问题描述】:

我有一个关联数组,但是当我使用下面的函数向它添加值时,它似乎覆盖了相同的键。有没有办法让多个相同的键具有不同的值?或者是否有其他形式的数组具有相同的格式?

我想拥有:

42=>56
42=>86
42=>97
51=>64
51=>52
etc etc

代码:

   function array_push_associative(&$arr) {
       $args = func_get_args();
       foreach ($args as $arg) {
           if (is_array($arg)) {
               foreach ($arg as $key => $value) {
                   $arr[$key] = $value;
                   $ret++;
               }
           }else{
               $arr[$arg] = "";
           }
       }
       return $ret;
    }

【问题讨论】:

  • 这些数字键是什么意思?

标签: php


【解决方案1】:

不,关联数组中不能有多个相同的键。

但是,您可以拥有唯一的键,每个键的对应值都是数组,并且这些数组的每个键都有多个元素。

所以不是这个...

42=>56 42=>86 42=>97 51=>64 51=>52

...你有这个:

Array (
    42 => Array ( 56, 86, 97 )
    51 => Array ( 64, 52 )
)

【讨论】:

    【解决方案2】:

    键是变量的扩展。如果你覆盖了变量...你覆盖了变量。

    【讨论】:

      【解决方案3】:

      不,你不能拥有。我使用的解决方法是将每个键/值对作为具有 2 个元素的新数组:

      $test = array(
           array(42,56),
           array(42,86),
           array(42,97),
           array(51,64),
           array(51,52)
      )
      

      例如,您可以使用以下方法访问第二个键 (=42):

      $test[1][0]
      

      第二个值(=86)使用:

       $test[1][1] 
      

      【讨论】:

      • 虽然 var 赋值的最终结果不能显示多个键,但您仍然可以在定义时定义它们。示例:$mytab = array('a' => 'valA', 'b' => 'valB', 'a' => 'anotherValA'); 那么预期的行为是最后发言的人是对的。你最终会得到这个数组:{ a => anotherValA, b => valB}
      • @FabienHaddadi 这样做的原因是什么,因为第一个会被第二个覆盖?这是一个故意的错误。
      • 没有正当理由!不好的做法。这是可能的,期间:-)我几个小时前刚刚在我的客户代码中修复了这个问题......
      【解决方案4】:

      我在研究完全相反的预期结果时发现了这个问题,我有一组具有重复键的数据!以下是我的做法(仍在尝试找出我的过程中哪里出了问题)。

      $session = time();
      $a = array();
      $a[(string)$session] = 0;
      $j = json_encode($a,JSON_FORCE_OBJECT);
      print_r($a);
      /* output:
      Array
      (
          [1510768034] => 0
      )
      */
      var_dump($a);
      /* output:
      array(1)
      (
          [1510768034] =>   int(0)
      )
      */
      print_r($j);
      /* output:
      {"1510768034":0}
      */
      $a = (array)json_decode($j);
      $session = @array_pop(array_keys($a));
      $a[(string)$session] = 10;
      $j = json_encode($a,JSON_FORCE_OBJECT);
      print_r($a);
      /* output:
      Array
      (
          [1510768034] => 0
          [1510768034] => 10
      )
      */
      var_dump($a);
      /* output:
      array(2)
      (
          '1510768034' => int(0)
          [1510768034] => int(10)
      )
      */
      print_r($j);
      /* output:
      {"1510768034":0,"1510768034":10}
      */
      

      是的....刚刚发生了。

      PHP 7.1

      编辑:在 PHP 7.2.10 中类似,除了 json_encode 不再接受重复的键,编码的字符串是正确的。但是,该数组可以具有匹配的字符串和整数键。

      【讨论】:

        【解决方案5】:

        我也有同样的需要,也需要创建一个具有相同键的数组,(只是为了通过使用两个循环而不是 4 个循环来保持性能)。

        通过使用:[$increment."-".$domain_id] => $article_id; 在 print_r() 之后,我在每个域中的文章列表如下所示:

        $AllSa  = Array
        (
            [1-5] => 143
            [2-5] => 176
            [3-5] => 992
            [4-2] => 60
            [5-2] => 41
            [6-2] => 1002
            [4-45] => 5
            [5-45] => 18
            [6-45] => 20
        )
        

        然后通过循环遍历此表以按域关联文章:

        $AssocSAPerDomain = array();
            $TempDomain       = "";
            $TempDomain_first = 0;
            foreach($tree_array as $id_domain => $id_sa){
                if( !$TempDomain && $TempDomain_first == 0 ){  $TempDomain = substr(strrchr($id_domain, "-"), 1); $TempDomain_first = 1; }
                $currentDomain = substr(strrchr($id_domain, "-"), 1);
                //if($TempDomain == $currentDomain) 
                $AssocSAPerDomain[$currentDomain][] = $id_sa;
                $TempDomain = substr(strrchr($id_domain, "-"), 1);
            }
        

        你明白了

        $assoc= Array
        (
            [5] => 143
                => 176
                => 992
            [2] => 60
                => 41
                => 1002
            [45]=> 5
                => 18
                => 20
        )
        

        【讨论】:

          【解决方案6】:

          这在技术上是不可能的。但我创造了一种有趣的方式来做到这一点????。请注意,这个答案只是为了好玩,最终目标是无论如何都要得到输出。

          所以这就是答案。您首先需要将整个数组转换为字符串。然后剩下的就是字符串替换和一点代码了。

          <?php
          
          $ary="array('a'=>123,'a'=>161,'a'=>195)";
          
          $str = str_replace("array(", "", $ary);
          $str = str_replace(")", "", $str);
          $arr = explode(",",$str);
          
          foreach($arr as $element){
              $element = str_replace("=>", "", $element);
              $element = str_replace("'", "", $element);
          
              echo $element.'<br>';
          }
          ?>
          

          这是输出

          【讨论】:

          • 看到您的解决方案后...我真的很困惑我是否应该投赞成票! :v
          • @fahim152 哈哈。它是由你决定。我只是展示了一种用于紧急目的的方法。因为从技术上讲这是不可能的,但如果你处于危急情况并且真的想这样做,那么这就是给你的。谢谢
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-26
          • 2015-07-23
          • 1970-01-01
          • 2015-06-26
          • 1970-01-01
          • 1970-01-01
          • 2013-09-13
          相关资源
          最近更新 更多