PHP关联数组重复键

Posted

技术标签:

【中文标题】PHP关联数组重复键【英文标题】:PHP Associative Array Duplicate Keys 【发布时间】:2010-05-21 01:54:49 【问题描述】:

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

我想拥有:

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;
    

【问题讨论】:

这些数字键是什么意思? 【参考方案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 哈哈。它是由你决定。我只是展示了一种用于紧急目的的方法。因为从技术上讲这是不可能的,但如果你处于危急情况并且真的想这样做,那么这就是给你的。谢谢

以上是关于PHP关联数组重复键的主要内容,如果未能解决你的问题,请参考以下文章

PHP 数组中的每个ID键关联一个值,可不可以关联两个值?

php判断数组是关联数组还是数值数组

PHP在关联数组前面加上文字键?

php - 如何在关联数组的数组中搜索多个键/值对并返回匹配项?

相交键后的PHP数组排序关联键

PHP - 需要帮助将数组插入到给定键的关联数组中