PHP dizisine hem değer hem de anahtar nasıl aktarılır


355

Şu koda bir göz atın:

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

Böyle bir şey arıyorum ki:

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

Bunu yapacak bir işlev var mı? (çünkü array_pushbu şekilde çalışmaz)

Yanıtlar:


760

Hayır, array_push()ilişkilendirilebilir diziler için eşdeğer yoktur, çünkü bir sonraki anahtarı belirlemenin bir yolu yoktur.

Kullanmanız gerekecek

$arrayname[indexname] = $value;

10
Anlamıyorum. Bu, bir diziye öğe eklemenin normal yolu değil mi?
rgin

Bir diziye birden çok anahtar ve değer nasıl eklenir? örneğin [indexname1] = $ değer1 ve [indexname2] = $ değer2 var ve bunları $ arrayname'e eklemek istiyorum
King Goeks

8
@KingGoeks $arrayname = array('indexname1' => $value1, 'indexname2' => $value2);bunları tek öğe olarak ayarlayacaktı $arrayname. Zaten $arraynameayarladıysanız ve değerlerini korumak istiyorsanız, deneyin $arrayname += $anotherarray. İlk dizideki mevcut anahtarların ikincisinin üzerine yazılacağını unutmayın.
Charlie Schliesser

1
"İlk dizideki mevcut anahtarların ikincisinin üzerine yazılacağını unutmayın" doğru değil, ilk dizinin önceliği vardır. yaparsan $a = array("name" => "John"); $a += array("name" => "Tom");o $a["name"]zaman "John" olacak
santiago arizti

bu en kolay yol.
NomanJaved

75

Bir değeri bir diziye itmek , otomatik olarak bir dizi için sayısal bir anahtar oluşturur.

Bir diziye bir anahtar / değer çifti eklerken, zaten anahtarınız vardır, sizin için bir tane oluşturmanıza gerek yoktur. Bir diziyi bir tuşa itmek mantıklı değil. Dizideki yalnızca belirli anahtarın değerini ayarlayabilirsiniz.

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

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

66

+Dizileri birleştirmek ve eklenen dizinin anahtarlarını tutmak için birleşim operatörünü ( ) kullanabilirsiniz. Örneğin:

<?php

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

print_r($arr3);

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

Böylece yapabilirsin $_GET += array('one' => 1);.

Sendika operatörünün kullanımı ile ilgili daha fazla bilgi http://php.net/manual/en/function.array-merge.php adresindekiarray_merge belgelerde bulunmaktadır .


4
array_merge()Ve +işleç arasındaki temel fark , 2 dizinin aynı anahtar +işleçteki değerleri içermesi , ikinci dizideki değeri yok saymasıdır (geçersiz kılmaz), ayrıca sayısal anahtarları yeniden numaralandırmaz / yeniden endekslemez ...
jave.web

Teşekkürler, birçok diziyi denedim ama cevabınız istediğimi elde etmeme yardımcı oldu,
Danimarka

21

Cevabımı masaya eklemek istiyorum ve işte burada:

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

umarım bu birine yardım eder


1
Düzinelerce çözüm aradım ve bu benim kullanım durumuma uyan tek çözüm. Teşekkür ederim!
Ryan Burney

20

Pekka'nın söyledikleri ...

Alternatif olarak, isterseniz array_merge komutunu şu şekilde kullanabilirsiniz:

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

Ama Pekka'nın yöntemini muhtemelen daha basit olduğu için tercih ederim.


11

Acaba neden en basit yöntem henüz gönderilmedi:

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

2
dizi_merge'de, sağdaki dizi anahtar çakışmasında kazanır, "+ =", soldaki dizi kazanır
santiago arizti

@santiagoarizti "Kazanan" ile ne demek istiyorsun?
AlexioVay

1
iki dizinin her ikisi de aynı anahtara sahipse array_mergeve dizi birliği ( +=) ters bir şekilde davranıyorsa, yani dizi_merge ikinci dizideki değere ve dizi birliği ilk dizideki değere saygı gösterir.
santiago arizti

benim için mükemmel bir çözüm. Alexio'yu paylaşmak için THX! :)
ThomasB

8

Bu sizin için yararlı olabilecek çözümdür

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

Çöpe attığında. Bunun gibi bir sonuç

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

Ben sadece aynı şeyi arıyordum ve bir kez daha düşüncelerimin farklı olduğunu fark ettim çünkü ben eski okulum. TEMEL ve PERL'e kadar geri gidiyorum ve bazen PHP'de işlerin ne kadar kolay olduğunu unutuyorum.

Ben sadece 3 sütun olduğu veritabanından tüm ayarları almak için bu işlevi yaptı. setkey, item (key) & value (value) seçin ve aynı tuş / değeri kullanarak yukarıdaki gibi push kullanmadan bunları settings adlı bir diziye yerleştirin.

Gerçekten çok kolay ve basit

// Tüm Ayarları Al
$ Ayarları = getGlobalSettings ();


// Kullanıcı Teması Seçimini Uygula
$ theme_choice = $ ayarlar ['tema'];

.. vs vs vs ....




işlevi getGlobalSettings () {

    $ dbc = mysqli_connect (wds_db_host, wds_db_user, wds_db_pass) veya die ("MySQL Hatası:". mysqli_error ());
    mysqli_select_db ($ dbc, wds_db_name) veya die ("MySQL Hatası:". mysqli_error ());
    $ MySQL = "SELECT * FROM systemSettings";
    $ sonuç = mysqli_query ($ dbc, $ MySQL);
    while ($ row = mysqli_fetch_array ($ sonuç)) 
        {
        $ settings [$ row ['item']] = $ row ['değer']; // PUSH İÇİN GEREK YOK
        }
    mysqli_close ($ dbc);
$ ayarlarına dön;
}


Yani diğer mesajlar açıklamak gibi ... php kullandığınızda bir dizi "PUSH" gerek yok

Anahtar => Değer

VE ... Önce diziyi de tanımlamanıza gerek yok.

$ Dizi = array ();

Tanımlamaya veya zorlamaya gerek yok. Sadece $ array [$ key] = $ value; Aynı anda otomatik olarak bir itme ve bildirimdir.

Güvenlik nedenleriyle, (P) oor (H) elpless (P) rotection eklemeliyim, Aptallar için Programlama, PHP demek istiyorum .... hehehe Bu kavramı sadece istediğim için kullanmanızı öneririm. Başka herhangi bir yöntem güvenlik riski olabilir. Orada, feragatnamemi yaptım!


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

Bu gayet iyi çalışıyor. anahtarı dizideki değeriyle oluşturur


4
Downvoted. Bu sadece varolan $arrdizinin sonuna yeni bir dizi iter .
AlexioVay

4

Biraz geç ama iç içe bir dizi sakıncası yoksa bu yaklaşımı alabilir:

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

Netleştirmek için eğer çıkış json_encode ($ main_array) gibi görünecektir [{ "Key": "10"}]


4

Biraz garip, ama bu benim için çalıştı

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

// dizi ['anahtar1' => "değer1", 'anahtar2' => "değer2"] yazdırır


2

merhaba ben aynı sorunu vardı ben bu çözümü bulmak iki dizileri kullanmak sonra ikisini birleştirmek gerekir

 <?php

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

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

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

print_r($c);

?>

başvuru: w3schools



2

İlk pozisyona ekleme için keyvevalue

$newAarray = [newIndexname => newIndexValue] ;

$yourArray = $newAarray + $yourArray ;

2

Mevcut bir diziye "anahtar" ve "değer" göndermek için +=kısayol operatörünü kullanabilirsiniz .

Bu çok basit örneğe bakın:

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

Sonuç print_r($GET):

Array
(
    [one] => 1
)

1

Örnek 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);

Dizi ([renk] => yeşil, [0] => 2, [1] => 4, [2] => a, [3] => b, [şekil] => yamuk, [4] => 4 ,)


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

Benim için çalışıyor.


Bu yürütülür $GET['one']=1, sonra söz konusu ifadenin dönüş değerini (= 1, değer) kullanır ve yürütür array_push($GET, 1). Sonuç = [0] -> 1, [bir] -> 1
KekuSemau

0

Basit bir fonksiyon yazdım:

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

böylece kolayca yeni eleman "upert" olabilir:

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

0

Burada zaten verilen bazı harika örnekler var. İlişkisel dizi öğelerini kök dizin dizinine itmek için basit bir örnek eklemek yeterlidir.

`$intial_content = array();

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

0

Genellikle bunu yaparım:

$array_name = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.