Como inserir valor e chave na matriz PHP

355

Dê uma olhada neste código:

$GET = array();    
$key = 'one=1';
$rule = explode('=', $key);
/* array_push($GET, $rule[0] => $rule[1]); */

Estou procurando algo assim para que:

print_r($GET);
/* output: $GET[one => 1, two => 2, ...] */

Existe uma função para fazer isso? (porque array_pushnão funcionará dessa maneira)

Garota
fonte

Respostas:

759

Não, não há array_push()equivalente para matrizes associativas porque não há como determinar a próxima chave.

Você terá que usar

$arrayname[indexname] = $value;
Pekka
fonte
10
Eu não entendo. Essa não é a maneira normal de adicionar itens a uma matriz?
Rg #
Como adicionar várias chaves e valores a uma matriz? por exemplo, eu tenho [indexname1] = $ value1 e [indexname2] = $ valor2, e eu quero adicioná-los a US $ arrayname
Rei Goeks
8
O @KingGoeks $arrayname = array('indexname1' => $value1, 'indexname2' => $value2);os definiria como os únicos itens $arrayname. Se você já $arraynameconfigurou e deseja manter seus valores, tente $arrayname += $anotherarray. Lembre-se de que todas as chaves existentes na primeira matriz serão substituídas pela segunda.
Charlie Schliesser
11
"Lembre-se de que todas as chaves existentes na primeira matriz serão substituídas pela segunda", o que não é verdade, a primeira matriz tem prioridade. se você fizer $a = array("name" => "John"); $a += array("name" => "Tom");isso $a["name"]será "John"
santiago arizti 31/01
é a maneira mais fácil.
NomanJaved
75

Empurrando um valor para uma matriz cria automaticamente uma chave numérica para ele.

Ao adicionar um par de valor-chave a uma matriz, você já tem a chave, não precisa ser criado para você. Pressionar uma chave em uma matriz não faz sentido. Você só pode definir o valor da chave específica na matriz.

// no key
array_push($array, $value);
// same as:
$array[] = $value;

// key already known
$array[$key] = $value;
deceze
fonte
66

Você pode usar o operador union ( +) para combinar matrizes e manter as chaves da matriz adicionada. Por exemplo:

<?php

$arr1 = array('foo' => 'bar');
$arr2 = array('baz' => 'bof');
$arr3 = $arr1 + $arr2;

print_r($arr3);

// prints:
// array(
//   'foo' => 'bar',
//   'baz' => 'bof',
// );

Então você poderia fazer $_GET += array('one' => 1);.

Há mais informações sobre o uso do operador union vs array_mergena documentação em http://php.net/manual/en/function.array-merge.php .

Charlie Schliesser
fonte
4
A diferença básica entre operador array_merge()e +é quando as duas matrizes contêm valores no mesmo +operador de chave ignora o valor da segunda matriz (não substitui), também não renumera / reindexa as chaves numéricas ...
jave.web
Obrigado, eu tentei a função de muitas matrizes, mas sua resposta me ajudou a alcançar o que eu quero,
dinamarquês
21

Gostaria de adicionar minha resposta à tabela e aqui está ela:

//connect to db ...etc
$result_product = /*your mysql query here*/ 
$array_product = array(); 
$i = 0;

foreach ($result_product as $row_product)
{
    $array_product [$i]["id"]= $row_product->id;
    $array_product [$i]["name"]= $row_product->name;
    $i++;
}

//you can encode the array to json if you want to send it to an ajax call
$json_product =  json_encode($array_product);
echo($json_product);

espero que isso ajude alguém

Nassim
fonte
11
Examinei dezenas de soluções e essa é a única que se encaixa no meu caso de uso. Obrigado!
22817 Ryan Burney
20

Exatamente o que Pekka disse ...

Como alternativa, você provavelmente pode usar array_merge assim se quiser:

array_merge($_GET, array($rule[0] => $rule[1]));

Mas eu preferiria o método de Pekka provavelmente porque é muito mais simples.

jeffff
fonte
11

Gostaria de saber por que o método mais simples ainda não foi publicado:

$arr = ['company' => 'Apple', 'product' => 'iPhone'];
$arr += ['version' => 8];
AlexioVay
fonte
2
não é exatamente o mesmo, em array_merge, a matriz da direita vence em conflito de chaves, "+ =" a matriz da esquerda vence
santiago arizti
@santiagoarizti O que você quer dizer com "vitórias"?
AlexioVay 27/08/19
11
se duas matrizes tiverem a mesma chave array_mergee a união da matriz ( +=) se comportar da maneira oposta, ou seja, array_merge respeitará o valor da segunda matriz e a união da matriz respeitará o valor da primeira matriz.
santiago Arizti
solução perfeita para mim. THX por compartilhar Alexio! :)
ThomasB
8

Esta é a solução que pode ser útil para você

Class Form {
# Declare the input as property
private $Input = [];

# Then push the array to it
public function addTextField($class,$id){
    $this->Input ['type'][] = 'text';
    $this->Input ['class'][] = $class;
    $this->Input ['id'][] = $id;
}

}

$form = new Form();
$form->addTextField('myclass1','myid1');
$form->addTextField('myclass2','myid2');
$form->addTextField('myclass3','myid3');

Quando você despeja. O resultado assim

array (size=3)
  'type' => 
    array (size=3)
      0 => string 'text' (length=4)
      1 => string 'text' (length=4)
      2 => string 'text' (length=4)
  'class' => 
    array (size=3)
      0 => string 'myclass1' (length=8)
      1 => string 'myclass2' (length=8)
      2 => string 'myclass3' (length=8)
  'id' => 
    array (size=3)
      0 => string 'myid1' (length=5)
      1 => string 'myid2' (length=5)
      2 => string 'myid3' (length=5)
Faris Rayhan
fonte
7

Eu estava apenas procurando a mesma coisa e percebi que, mais uma vez, meu pensamento é diferente porque sou da velha escola. Volto ao BASIC e PERL e às vezes esqueço como as coisas são fáceis no PHP.

Acabei de fazer essa função para tirar todas as configurações do banco de dados onde estão três colunas. setkey, item (chave) e valor (valor) e coloque-os em uma matriz chamada configurações usando a mesma chave / valor sem usar push, como acima.

Muito fácil e simples realmente

// Obter todas as configurações
$ configurações = getGlobalSettings ();


// Aplicar opção de tema do usuário
$ theme_choice = $ settings ['tema'];

.. etc etc etc ....




função getGlobalSettings () {

    $ dbc = mysqli_connect (wds_db_host, wds_db_user, wds_db_pass) ou die ("Erro no MySQL:". mysqli_error ());
    mysqli_select_db ($ dbc, wds_db_name) ou die ("Erro no MySQL:". mysqli_error ());
    $ MySQL = "SELECT * FROM systemSettings";
    $ resultado = mysqli_query ($ dbc, $ MySQL);
    while ($ row = mysqli_fetch_array ($ resultado)) 
        {
        $ settings [$ row ['item']] = $ row ['value']; // NECESSIDADE DE IMPULSÃO
        }
    mysqli_close ($ dbc);
retornar $ configurações;
}


Assim como os outros posts explicam ... No php não há necessidade de "PUSH" um array quando você estiver usando

Chave => Valor

E ... Também não há necessidade de definir a matriz.

$ array = array ();

Não precisa definir ou pressionar. Apenas atribua $ array [$ key] = $ value; É automaticamente um envio e uma declaração ao mesmo tempo.

Devo acrescentar que, por razões de segurança, (P) ou (H) rotações indefesas (P), quero dizer Programação para Leigos, quero dizer PHP .... hehehe, sugiro que você use esse conceito apenas para o que pretendia. Qualquer outro método pode ser um risco de segurança. Lá, fez o meu aviso!

Cory Cullers
fonte
5
array_push($arr, ['key1' => $value1, 'key2' => value2]);

Isso funciona muito bem. cria a chave com seu valor na matriz

Mesh Manuel
fonte
4
Votado. Isso apenas empurra uma nova matriz no final da $arrmatriz existente .
precisa saber é o seguinte
4

Um pouco tarde, mas se você não se importa com uma matriz aninhada, pode seguir esta abordagem:

$main_array = array(); //Your array that you want to push the value into
$value = 10; //The value you want to push into $main_array
array_push($main_array, array('Key' => $value));

Para esclarecer, se você gerar json_encode ($ main_array), será semelhante a [{"Key": "10"}]

Pontus B
fonte
4

Um pouco estranho, mas isso funcionou para mim

    $array1 = array("Post Slider", "Post Slider Wide", "Post Slider");
    $array2 = array("Tools Sliders", "Tools Sliders", "modules-test");
    $array3 = array();

    $count = count($array1);

    for($x = 0; $x < $count; $x++){
       $array3[$array1[$x].$x] = $array2[$x];
    }

    foreach($array3 as $key => $value){
        $output_key = substr($key, 0, -1);
        $output_value = $value;
        echo $output_key.": ".$output_value."<br>";
    }
Bjorn Lottering
fonte
3
 $arr = array("key1"=>"value1", "key2"=>"value");
    print_r($arr);

// imprime matriz ['chave1' => "valor1", 'chave2' => "valor2"]

sneha
fonte
2

oi eu tive o mesmo problema eu acho que esta solução você deve usar duas matrizes, em seguida, combinar os dois

 <?php

$fname=array("Peter","Ben","Joe");

$age=array("35","37","43");

$c=array_combine($fname,$age);

print_r($c);

?>

referência: w3schools

fantome195
fonte
2

Para adicionar à primeira posição com keyevalue

$newAarray = [newIndexname => newIndexValue] ;

$yourArray = $newAarray + $yourArray ;
Bashirpour
fonte
2

Para enviar uma "chave" e "valor" a uma matriz existente, você pode usar o +=operador de atalho.

Veja este exemplo muito simples:

$GET = [];
$GET += ['one' => 1];

O resultado de print_r($GET)será:

Array
(
    [one] => 1
)
Nurul Huda
fonte
1

Exemplo array_merge () ....

$array1 = array("color" => "red", 2, 4); $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); $result = array_merge($array1, $array2); print_r($result);

Matriz ([cor] => verde, [0] => 2, [1] => 4, [2] => a, [3] => b, [forma] => trapézio, [4] => 4 ,)

illeas
fonte
1
array_push($GET, $GET['one']=1);

Funciona para mim.

aaa
fonte
Isso é executado $GET['one']=1, usa o valor de retorno dessa instrução (= 1, o rvalue) e, em seguida, é executado array_push($GET, 1). Resultado = [0] -> 1, [um] -> 1
KekuSemau 08/07/19
0

Eu escrevi uma função simples:

function push(&$arr,$new) {
    $arr = array_merge($arr,$new);
}

para que eu possa "upsert" novo elemento facilmente:

push($my_array, ['a'=>1,'b'=>2])
Elect2
fonte
0

Há um ótimo exemplo já dado aqui. Basta adicionar um exemplo simples para enviar elementos de matriz associativa para o índice de índice numérico raiz.

`$intial_content = array();

if (true) {
 $intial_content[] = array('name' => 'xyz', 'content' => 'other content');
}`
Deepak Rajpal
fonte
0

Eu costumo fazer isso:

$array_name = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
marcnyc
fonte