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)

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;

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;

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 .


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


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.


11

Zastanawiam się, dlaczego nie opublikowano jeszcze najprostszej metody:

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

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)

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!


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

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


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


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

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

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


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



2

Aby dodać do pierwszej pozycji za pomocą keyivalue

$newAarray = [newIndexname => newIndexValue] ;

$yourArray = $newAarray + $yourArray ;

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
)

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


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

Mi to pasuje.


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

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

0

Zazwyczaj robię to:

$array_name = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.