Jak wcisnąć zarówno wartość, jak i klucz do tablicy PHP

355

Spójrz na ten kod:

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

Szukam czegoś takiego, aby:

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

Czy jest do tego funkcja? (ponieważ array_pushnie będzie działać w ten sposób)

Gal
źródło

Odpowiedzi:

759

Nie, nie ma array_push()odpowiednika dla tablic asocjacyjnych, ponieważ nie ma możliwości ustalenia następnego klucza.

Musisz użyć

$arrayname[indexname] = $value;
Pekka
źródło
10
Nie rozumiem Czy to nie jest normalny sposób dodawania elementów do tablicy?
rgin
Jak dodać wiele kluczy i wartości do tablicy? na przykład mam [indexname1] = $ wartość1 i [indexname2] = $ wartość2 i chcę je dodać do $ arrayname
King Goeks
8
@KingGoeks $arrayname = array('indexname1' => $value1, 'indexname2' => $value2);ustawi je jako jedyne elementy w $arrayname. Jeśli już $arraynameustawiłeś i chcesz zachować jego wartości, spróbuj $arrayname += $anotherarray. Należy pamiętać, że wszystkie istniejące klucze w pierwszej tablicy zostaną zastąpione przez drugą.
Charlie Schliesser,
1
„Pamiętaj, że wszystkie istniejące klucze w pierwszej tablicy zostaną nadpisane przez drugą”, co nie jest prawdą, pierwsza tablica ma priorytet. jeśli to zrobisz, $a = array("name" => "John"); $a += array("name" => "Tom");to $a["name"]będzie „John”
santiago arizti
to najprostszy sposób.
NomanJaved
75

Wepchnięcie wartości do tablicy automatycznie tworzy dla niej klucz numeryczny.

Kiedy dodajesz parę klucz-wartość do tablicy, masz już klucz, nie musisz go tworzyć. Wciśnięcie klucza do tablicy nie ma sensu. Możesz ustawić tylko wartość określonego klucza w tablicy.

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

// key already known
$array[$key] = $value;
deceze
źródło
66

Możesz użyć operatora union ( +) do łączenia tablic i zachowania kluczy dodanej tablicy. Na przykład:

<?php

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

print_r($arr3);

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

Więc możesz to zrobić $_GET += array('one' => 1);.

Więcej informacji na temat korzystania z operatora związku vs można znaleźć array_mergew dokumentacji na stronie http://php.net/manual/en/function.array-merge.php .

Charlie Schliesser
źródło
4
Podstawowa różnica między operatorem array_merge()a +operatorem polega na tym, że 2 tablice zawierają wartości tego samego +operatora klucza , ignoruje wartość z drugiej tablicy (nie zastępuje), a także nie przenumerowuje / nie reindeksuje klawiszy numerycznych ...
jave.web
Dziękuję, próbowałem wielu funkcji tablic, ale twoja odpowiedź pomogła mi osiągnąć to, czego chcę,
duński
21

Chciałbym dodać moją odpowiedź do tabeli i oto ona:

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

mam nadzieję, że to komuś pomoże

Nassim
źródło
1
Przejrzałem dziesiątki rozwiązań i jest to jedyne, które pasuje do mojego przypadku użycia. Dziękuję Ci!
Ryan Burney
20

Dokładnie to, co powiedział Pekka ...

Alternatywnie, możesz prawdopodobnie użyć array_merge w ten sposób, jeśli chcesz:

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

Ale wolałbym metodę Pekki prawdopodobnie, ponieważ jest o wiele prostsza.

Jeff
źródło
11

Zastanawiam się, dlaczego nie opublikowano jeszcze najprostszej metody:

$arr = ['company' => 'Apple', 'product' => 'iPhone'];
$arr += ['version' => 8];
AlexioVay
źródło
2
nie jest dokładnie taki sam, w array_merge tablica po prawej stronie wygrywa w kluczowym konflikcie, w „+ =” tablica po lewej wygrywa
santiago arizti
@santiagoarizti Co rozumiesz przez „wygrane”?
AlexioVay
1
jeśli dwie tablice mają oba ten sam klucz, array_mergea union union ( +=) zachowuje się w odwrotny sposób, tj. array_merge będzie respektować wartość z drugiej tablicy, a union union będzie respektować wartość z pierwszej tablicy.
Santiago arizti
idealne rozwiązanie dla mnie. Dzięki za udostępnienie Alexio! :)
ThomasB
8

To rozwiązanie może być przydatne dla Ciebie

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

Kiedy to rzucisz. Wynik taki jak ten

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
źródło
7

Po prostu szukałem tego samego i zdałem sobie sprawę, że po raz kolejny moje myślenie jest inne, ponieważ jestem starą szkołą. Wracam do BASIC i PERL i czasami zapominam, jak proste są rzeczy w PHP.

Właśnie wykonałem tę funkcję, aby pobrać wszystkie ustawienia z bazy danych, w której są 3 kolumny. setkey, item (key) & value (value) i umieść je w tablicy o nazwie settings używając tego samego klucza / wartości bez użycia push tak jak powyżej.

Całkiem łatwe i proste naprawdę

// Uzyskaj wszystkie ustawienia
$ settings = getGlobalSettings ();


// Zastosuj wybór motywu użytkownika
$ theme_choice = $ settings ['theme'];

.. etc etc etc ....




funkcja getGlobalSettings () {

    $ dbc = mysqli_connect (wds_db_host, wds_db_user, wds_db_pass) lub die („Błąd MySQL:”. mysqli_error ());
    mysqli_select_db ($ dbc, wds_db_name) lub die („Błąd MySQL:”. mysqli_error ());
    $ MySQL = "SELECT * FROM systemSettings";
    $ wynik = mysqli_query ($ dbc, $ MySQL);
    while ($ row = mysqli_fetch_array ($ wynik)) 
        {
        $ settings [$ row ['item']] = $ row ['value']; // NIE POTRZEBUJESZ PUSH
        }
    mysqli_close ($ dbc);
zwróć ustawienia $;
}


Podobnie jak inne posty wyjaśniają ... W php nie ma potrzeby „PUSH” tablicy, gdy używasz

Klucz => wartość

ORAZ ... Nie ma też potrzeby najpierw definiować tablicy.

$ array = array ();

Nie musisz definiować ani naciskać. Po prostu przypisz $ array [$ key] = $ value; Jest to automatycznie push i deklaracja w tym samym czasie.

Muszę dodać, że ze względów bezpieczeństwa, (P) oor (H) elpless (P) rotacja, mam na myśli Programowanie dla manekinów, mam na myśli PHP ... hehehe Sugeruję, abyś używał tej koncepcji tylko do tego, co zamierzałem. Każda inna metoda może stanowić zagrożenie bezpieczeństwa. Tam zrobiłem moje zastrzeżenie!

Cory Cullers
źródło
5
array_push($arr, ['key1' => $value1, 'key2' => value2]);

To działa dobrze. tworzy klucz z jego wartością w tablicy

Mesh Manuel
źródło
4
Doceniony. To popycha nową tablicę na końcu istniejącej $arrtablicy.
AlexioVay
4

Trochę późno, ale jeśli nie przeszkadza ci tablica zagnieżdżona, możesz zastosować następujące podejście:

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

Aby to wyjaśnić, jeśli wypiszesz json_encode ($ main_array), który będzie wyglądał jak [{„Key”: „10”}]

Pontus B.
źródło
4

Trochę dziwne, ale to zadziałało dla mnie

    $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
źródło
3
 $arr = array("key1"=>"value1", "key2"=>"value");
    print_r($arr);

// drukuje tablicę ['key1' => „wartość1”, „key2” => „wartość2”]

sneha
źródło
2

cześć, miałem ten sam problem, znajduję to rozwiązanie, powinieneś użyć dwóch tablic, a następnie połączyć je oba

 <?php

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

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

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

print_r($c);

?>

referencja: w3schools

fantome195
źródło
2

Aby dodać do pierwszej pozycji za pomocą keyivalue

$newAarray = [newIndexname => newIndexValue] ;

$yourArray = $newAarray + $yourArray ;
Bashirpour
źródło
2

Aby wypchnąć „klucz” i „wartość” do istniejącej tablicy, możesz użyć +=operatora skrótu.

Zobacz ten bardzo prosty przykład:

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

Wynikiem print_r($GET)będzie:

Array
(
    [one] => 1
)
Nurul Huda
źródło
1

Przykład 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);

Tablica ([kolor] => zielony, [0] => 2, [1] => 4, [2] => a, [3] => b, [kształt] => trapezoid, [4] => 4 ,)

Illeas
źródło
1
array_push($GET, $GET['one']=1);

Mi to pasuje.

aaa
źródło
Wykonuje się $GET['one']=1, następnie używa wartości zwracanej tej instrukcji (= 1, wartość), a następnie wykonuje się array_push($GET, 1). Wynik = [0] -> 1, [jeden] -> 1
KekuSemau
0

Napisałem prostą funkcję:

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

dzięki czemu mogę łatwo „wstawić” nowy element:

push($my_array, ['a'=>1,'b'=>2])
Elect2
źródło
0

Podano już świetny przykład. Wystarczy dodać prosty przykład, aby wypchnąć elementy tablicy asocjacyjnej do głównego indeksu liczbowego indeksu.

`$intial_content = array();

if (true) {
 $intial_content[] = array('name' => 'xyz', 'content' => 'other content');
}`
Deepak Rajpal
źródło
0

Zazwyczaj robię to:

$array_name = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
marcnyc
źródło