PHP关联数组重复键

19

我有一个关联数组,但是当我使用下面的函数向其中添加值时,它似乎会覆盖相同的键。有没有一种方法可以使用不同的值具有多个相同的键?或者有没有其他格式相同的数组类型?

我想要的是:

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;
    }

这些数字键的含义是什么? - Your Common Sense
6个回答

40
不,你不能在关联数组中有多个相同的键。但是,你可以拥有唯一的键,每个对应的值都是数组,这些数组有多个元素与每个键相关联。所以,不要出现这种情况...
42=>56 42=>86 42=>97 51=>64 51=>52

…你有这个:

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

8
一个键是变量的扩展。如果你覆盖了变量... 那么你就覆盖了这个变量。

5

不,你不能这样做。我使用的一个解决办法是将每个键/值对作为一个新数组并具有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] 

虽然变量赋值的最终结果不能显示多个键,但您仍然可以在定义时定义它们。例如: $mytab = array('a' => 'valA', 'b' => 'valB', 'a' => 'anotherValA'); 期望的行为是“后来居上”。您将得到以下数组: { a => anotherValA, b => valB} - Fabien Haddadi
@FabienHaddadi 这么做的原因是什么,既然第一个会被第二个覆盖?这是一个故意制造的错误。 - Aris
没有任何有效的理由!这是不好的实践。只是可能,就这样 :-) 几个小时前我刚刚在客户端代码中修复了这个问题... - Fabien Haddadi

2

我在研究完全相反的预期结果时发现了这个问题,我有一个具有重复键的数据数组!以下是我的解决方法(仍在努力弄清楚我的过程中哪些地方出了问题)。

$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 不再接受重复的键,编码后的字符串是正确的。然而,数组可以有匹配的字符串和整数键。


0
我也有同样的需求,需要创建一个具有相同键的数组(只是为了通过使用两个循环而不是4个循环来保持性能)。
通过使用这个:[$increment."-".$domain_id] => $article_id; 在每个域中文章列表的输出结果如下:
$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
)

0

从技术上讲,这是不可能的。但我创造了一种有趣的方法来实现它。请注意,这个答案只是为了好玩,最终目标仍然是得到输出。

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

<?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
@fahim152 哈哈。这取决于你。我只是展示了一种应急情况下的解决方法。因为从技术上讲,这是不可能的,但如果你处于紧急情况并且真的想要这样做,那么这对你有用。谢谢。 - santosh devnath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接