Come inserire sia valore che chiave nell'array PHP


355

Dai un'occhiata a questo codice:

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

Sto cercando qualcosa del genere in modo che:

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

C'è una funzione per farlo? (perché array_pushnon funzionerà in questo modo)

Risposte:


759

No, non esiste un array_push()equivalente per gli array associativi perché non è possibile determinare la chiave successiva.

Dovrai usare

$arrayname[indexname] = $value;

10
Non capisco Non è questo il modo normale di aggiungere elementi in un array?
rgin,

Come aggiungere più chiavi e valori a un array? per esempio ho [indexname1] = $ value1 e [indexname2] = $ value2 e voglio aggiungerli a $
arrayname

8
@KingGoeks $arrayname = array('indexname1' => $value1, 'indexname2' => $value2);li avrebbe impostati come gli unici elementi in $arrayname. Se hai già $arraynameimpostato e desideri mantenerne i valori, prova $arrayname += $anotherarray. Tenere presente che qualsiasi chiave esistente nel primo array verrebbe sovrascritta dal secondo.
Charlie Schliesser,

1
"Ricorda che qualsiasi chiave esistente nel primo array verrebbe sovrascritta dal secondo" che non è vero, il primo array ha la priorità. se lo fai, $a = array("name" => "John"); $a += array("name" => "Tom");allora $a["name"]sarà "John"
santiago arizti

è il modo più semplice.
NomanJaved

75

L' inserimento di un valore in un array crea automaticamente una chiave numerica per esso.

Quando aggiungi una coppia chiave-valore a un array, hai già la chiave, non ne hai bisogno per crearla. Inserire una chiave in un array non ha senso. È possibile impostare solo il valore della chiave specifica nell'array.

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

// key already known
$array[$key] = $value;

66

È possibile utilizzare l'operatore union ( +) per combinare array e conservare le chiavi dell'array aggiunto. Per esempio:

<?php

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

print_r($arr3);

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

Quindi potresti farlo $_GET += array('one' => 1);.

Ulteriori informazioni sull'utilizzo dell'operatore sindacale rispetto array_mergealla documentazione sono disponibili su http://php.net/manual/en/function.array-merge.php .


4
La differenza di base tra array_merge()e +operatore è quando i 2 array contengono valori sullo stesso +gestore chiavi ignora il valore dal secondo array (non sovrascrive), inoltre non rinumera / reindicizza i tasti numerici ...
jave.web

Grazie, ho provato molte funzioni di array ma la tua risposta mi ha aiutato a raggiungere quello che voglio,
danese

21

Vorrei aggiungere la mia risposta alla tabella ed eccola qui:

//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);

spero che questo possa aiutare qualcuno


1
Ho esaminato decine di soluzioni e questa è l'unica adatta al mio caso d'uso. Grazie!
Ryan Burney,

20

Esattamente quello che ha detto Pekka ...

In alternativa, puoi probabilmente usare array_merge in questo modo se volessi:

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

Ma preferirei il metodo di Pekka probabilmente perché è molto più semplice.


11

Mi chiedo perché il metodo più semplice non sia stato ancora pubblicato:

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

2
non è esattamente lo stesso, in array_merge, l'array a destra vince sul conflitto chiave, in "+ =" l'array a sinistra vince
santiago arizti

@santiagoarizti Cosa intendi con "vittorie"?
AlexioVay

1
se due array hanno entrambe la stessa chiave array_mergee array union ( +=) si comporta in modo opposto, ovvero array_merge rispetterà il valore del secondo array e union array rispetterà il valore del primo array.
santiago arizti,

soluzione perfetta per me. Grazie per aver condiviso Alexio! :)
ThomasB

8

Questa è la soluzione che potrebbe esserti utile

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 lo scarichi. Il risultato è così

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

Stavo solo cercando la stessa cosa e mi sono reso conto che, ancora una volta, il mio pensiero è diverso perché sono vecchia scuola. Vado indietro a BASIC e PERL e a volte dimentico quanto siano veramente facili le cose in PHP.

Ho appena fatto questa funzione per prendere tutte le impostazioni dal database in cui sono 3 colonne. setkey, item (key) & value (value) e inseriscili in un array chiamato settings usando lo stesso key / value senza usare push proprio come sopra.

Abbastanza facile e semplice davvero

// Ottieni tutte le impostazioni
$ impostazioni = getGlobalSettings ();


// Applica la scelta del tema dell'utente
$ theme_choice = $ settings ['theme'];

.. ecc ecc ecc ecc ....




funzione getGlobalSettings () {

    $ dbc = mysqli_connect (wds_db_host, wds_db_user, wds_db_pass) o die ("Errore MySQL:". mysqli_error ());
    mysqli_select_db ($ dbc, wds_db_name) o die ("Errore MySQL:". mysqli_error ());
    $ MySQL = "SELEZIONA * DAImpostazioni di sistema";
    $ risultato = mysqli_query ($ dbc, $ MySQL);
    while ($ row = mysqli_fetch_array ($ risultato)) 
        {
        $ settings [$ row ['item']] = $ row ['value']; // NESSUN BISOGNO DI PUSH
        }
    mysqli_close ($ DBC);
restituisce $ settings;
}


Quindi, come spiegano gli altri post ... In php non è necessario "PUSH" un array quando si utilizza

Chiave => Valore

E ... Non è nemmeno necessario definire prima l'array.

$ Array = array ();

Non è necessario definire o spingere. Basta assegnare $ array [$ key] = $ value; È automaticamente una spinta e una dichiarazione allo stesso tempo.

Devo aggiungere che per motivi di sicurezza, (P) o (H) elpless (P) rotazione, intendo Programmazione per manichini, intendo PHP .... hehehe suggerisco di usare questo concetto solo per quello che intendevo. Qualsiasi altro metodo potrebbe essere un rischio per la sicurezza. Ecco, ha reso il mio disclaimer!


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

Questo funziona bene. crea la chiave con il suo valore nella matrice


4
Downvoted. Questo spinge semplicemente un nuovo array alla fine $arrdell'array esistente .
AlexioVay,

4

Un po 'in ritardo ma se non ti dispiace un array nidificato potresti adottare questo approccio:

$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));

Per chiarire, se si genera json_encode ($ main_array) che apparirà come [{"Key": "10"}]


4

Un po 'strano, ma questo ha funzionato per me

    $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);

// stampa array ['key1' => "value1", 'key2' => "value2"]


2

ciao ho avuto lo stesso problema trovo questa soluzione dovresti usare due array quindi combinarli entrambi

 <?php

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

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

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

print_r($c);

?>

riferimento: w3schools



2

Per aggiungere alla prima posizione con keyevalue

$newAarray = [newIndexname => newIndexValue] ;

$yourArray = $newAarray + $yourArray ;

2

Per inviare un "tasto" e un "valore" a un array esistente, è possibile utilizzare l' +=operatore di collegamento.

Vedi questo esempio molto semplice:

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

Il risultato di print_r($GET)sarà:

Array
(
    [one] => 1
)

1

Esempio 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);

Array ([color] => green, [0] => 2, [1] => 4, [2] => a, [3] => b, [shape] => trapezoid, [4] => 4 ,)


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

Per me funziona.


Questo viene eseguito $GET['one']=1, quindi utilizza il valore restituito di tale istruzione (= 1, il valore r) e quindi viene eseguito array_push($GET, 1). Risultato = [0] -> 1, [uno] -> 1
KekuSemau

0

Ho scritto una semplice funzione:

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

in modo che io possa "sostenere" facilmente il nuovo elemento:

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

0

Ci sono già dei grandi esempi qui forniti. Basta aggiungere un semplice esempio per inviare gli elementi dell'array associativo all'indice dell'indice numerico di root.

`$intial_content = array();

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

0

Di solito lo faccio:

$array_name = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.