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)

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;

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;

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 .


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


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.


11

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

$arr = ['company' => 'Apple', 'product' => 'iPhone'];
$arr += ['version' => 8];

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)

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!


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

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


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"}]


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>";
    }

3
 $arr = array("key1"=>"value1", "key2"=>"value");
    print_r($arr);

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


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



2

Para adicionar à primeira posição com keyevalue

$newAarray = [newIndexname => newIndexValue] ;

$yourArray = $newAarray + $yourArray ;

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
)

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 ,)


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

Funciona para mim.


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

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');
}`

0

Eu costumo fazer isso:

$array_name = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.