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关联数组重复键的主要内容,如果未能解决你的问题,请参考以下文章