Повторяющиеся ключи для ассоциативных массивов PHP

У меня есть ассоциативный массив, однако, когда я добавляю к нему значения, используя приведенную ниже функцию, кажется, что они перезаписывают одни и те же ключи. Есть ли способ иметь несколько одинаковых ключей с разными значениями? Или есть другая форма массива, которая имеет тот же формат?

Я хочу иметь:

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

Нет, этого не может быть. Обходной путь, который я использую, состоит в том, чтобы каждая пара ключей/значений являлась новым массивом с двумя элементами:

$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] 

Ответ 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
)