Adicionar um item a uma matriz associativa

88
//go through each question
foreach($file_data as $value) {
   //separate the string by pipes and place in variables
   list($category, $question) = explode('|', $value);

   //place in assoc array
   $data = array($category => $question);
   print_r($data);

}

Isso não está funcionando, pois substitui o valor dos dados. Como posso fazer com que ele adicione um valor associativo a cada loop? $file_dataé uma matriz de dados de tamanho dinâmico.

Phil
fonte

Respostas:

96

Eu acho que você quer $data[$category] = $question;

Ou no caso de você desejar uma matriz que mapeie categorias para uma série de perguntas:

$data = array();
foreach($file_data as $value) {
    list($category, $question) = explode('|', $value, 2);

    if(!isset($data[$category])) {
        $data[$category] = array();
    }
    $data[$category][] = $question;
}
print_r($data);
ThiefMaster
fonte
9
Outros programadores irão odiar você por erros de digitação, já que serão forçados a cometê-los também ou corrigi-los.
ThiefMaster
Eu estava muito confortável com array_push, esqueci o básico! Realmente util!
CLOUGH
121

Você pode simplesmente fazer isso

$data += array($category => $question);

Se você estiver executando em php 5.4+

$data += [$category => $question];
Mohyaddin Alaoddin
fonte
21
o que no mundo?
Phil,
9
Esta é a resposta correta para adicionar itens a uma matriz associativa.
andreszs
7
Adicione vários elementos também: $ data + = ['x' => 1, 'y' => 2];
divisão
este é o caminho se você não quiser acabar com mais de um objeto dentro do array
DragonFire,
Nota: isso pode funcionar se o seu array ainda não tiver um elemento com a mesma chave, então ele não pode sobrescrever um elemento existente.
Mohamad Hamouday
29

antes do loop:

$data = array();

então em seu loop:

$data[] = array($catagory => $question);
moe
fonte
2
Se você fizer isso dessa forma, não se esqueça de iniciar o array primeiro usando $ data = array (); ou então o php lançará um aviso
Alex Bailey
Acho que o SO armazena minha resposta em cache, assim que postei, percebi que não a vi sendo inicializada em seu código. Então eu adicionei e vi seu comentário depois, obrigado :-)
moe
4
Isso não funcionou porque criou uma matriz dentro da matriz. Desculpe se a minha pergunta meio que através de você.
Phil
PHP 5.4+ você pode escrever um pouco menos código:$data=[]; $data[] = [$category => $question];
Justin
$res = array(); $res[] = array('foo' => $bar); $foo = $res['foo'];falha com índice indefinido: foo in .. , mas o sinal de mais sugerido abaixo funciona.
qrtLs
7

Eu sei que esta é uma pergunta antiga, mas você pode usar:

array_push($data, array($category => $question));

Isso empurrará o arraypara o fim de sua corrente array. Ou se você está apenas tentando adicionar valores únicos ao final de sua matriz, não mais matrizes, então você pode usar isto:

array_push($data,$question);
Mike
fonte
6

Para qualquer um que também precise adicionar em 2d array associativo, você também pode usar a resposta dada acima e usar o código como este

 $data[$category]["test"] = $question

você pode então chamá-lo (para testar o resultado:

echo $data[$category]["test"];

que deve imprimir $ question

maximran
fonte