我有一个关联数组,但是当我使用下面的函数向它添加值时,它似乎会覆盖相同的键。有没有办法让多个相同的键具有不同的值?或者是否有另一种格式相同的数组?
我希望:
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;
}
答案 0 :(得分:31)
不,你不能在关联数组中拥有多个相同的键。
但是,您可以使用唯一键,每个键的对应值都是数组,并且这些数组的每个键都有多个元素。
所以不要这样......
42=>56 42=>86 42=>97 51=>64 51=>52
......你有这个:
Array (
42 => Array ( 56, 86, 97 )
51 => Array ( 64, 52 )
)
答案 1 :(得分:8)
键是变量的扩展名。如果覆盖变量......则覆盖变量。
答案 2 :(得分:2)
不,你不能拥有。我使用的解决方法是将每个键/值对作为包含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]
答案 3 :(得分:1)
我在研究完全相反的预期结果的同时发现了这个问题,我有一系列具有重复键的数据!这是我如何做到的(仍然试图弄清楚我的过程中的东西搞砸了)。
$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不再接受重复键,编码字符串是正确的。但是,该数组可以具有匹配的字符串和整数键。
答案 4 :(得分:0)
使用此:[$ 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
)
答案 5 :(得分: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>';
}
?>