PHP: reindexing yerine anahtarları tutarken iki dizileri birleştirmek?


255

String / int tuşlarını tutarken iki diziyi (biri string => değer çiftleriyle diğeri int => değer çiftleriyle) nasıl birleştirebilirim? Hiçbiri üst üste gelmeyecek (çünkü biri sadece dizgiler ve diğeri sadece tamsayılara sahip).

İşte benim geçerli kod (dizi_merge dizi tamsayı anahtarları ile yeniden dizine çünkü bu çalışmıyor):

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
Bu garip: PHP doc sayfasına göre array_merge bunu yapmamalı . Dize anahtarları aslında tamsayıların dize gösterimleri midir?
owenmarshall

array_merge ikinci dizimi yeniden endeksliyor. yani. dizi olarak array( 123 => "VALUE123" )değiştirirarray( 0 => "VALUE123" )
Garrett

hmm, bu ilginç. PHP belgelerinin bu noktada biraz belirsiz olabileceğini düşünüyorum. Tüm dizilerin sayısal anahtarları varsa ne olacağını söyler , ancak özel olarak yoksa ne olacağını söylemez.
Steven Oxley

belki 2 yıl önce değil. Ancak 2012'de bu noktada dokümantasyon çok net.
cartbeforehorse

Aslında, belgeler hala çok net değil. "Sayısal" aslında tüm basamakları içeren bir dize içerir (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Bob Stein

Yanıtlar:


557

Dizileri 'ekleyebilir':

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
Bu konuda ÇOK dikkatli olun! + Operatörü bir ek değildir, bir birliktir. Anahtarlar üst üste
binmezse

3
Sadece vay canına - yaklaşık üç yıl sonra bana kod satırları kurtardın
Stephen O'Flynn

86
Kimse 'ne çakışırsa?' : php.net: "+ işleci, sol diziye eklenmiş sağdaki diziyi döndürür; her iki dizide de bulunan tuşlar için, sol dizideki öğeler ve sağdaki eşleşen öğeler kullanılır -hand dizisi yoksayılır. "
Flion

2
@Flion bundan daha karmaşık. '+' Kullanarak, ortak bir anahtar ve alt anahtar içeren bir öğe içeren iki alt dizi ekledim: değerler eklendi! 100000 => dizi (boyut = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => dizi (boyut = 1) 2 => int 30 Sonuç: 100000 => dizi (boyut = 3) 1 => int 128 2 => int 86 3 => int 7 Temel olarak [2 => 56] + [2 => 30] eklemek, değerin yerine geçmedi ancak ekledi ve [2 => 86] oldu
Dario Fumagalli

1
@DarioFumagalli Yanlış anladığımı veya 2016'dan bu yana değişip değişmediğini bilmiyorum, ancak bu noktada operasyon print_r([2 => 56] + [2 => 30]);ortaya çıkıyor Array ( [2] => 56 ). Yani, sol tarafı belirtildiği gibi tutuyor. PHP 7.1.19'dan itibaren repl.it üzerinde çalışıyor .
Charles Wood

62

Sahip olduğunuzu göz önünde bulundurarak

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

Yapacağınız $merge = $replacement + $replaced;çıktı:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

Toplamdaki ilk dizi, son çıktıda değerlere sahip olacaktır.

Yapacağınız $merge = $replaced + $replacement;çıktı:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[thumbsup]] bu konuda
Jhourlad Estrella

21
Özetlemek gerekirse, 2 dizi eklerken, birinci dizideki değerler ikinciden geçersiz kılma değerlerini gösterir.
Dziamid

1
Ben ikincisinin ilkini geçersiz kılacağını düşündüm. :)
Asim KT

1
Kesinlikle. Bu yüzden kullanamadım $allValues += $newValues;.
MarthyM

Yapacak $merge = $replacement + $replaced;çıktı:Array ( [4] => value2 [6] => value3 [1] => value1 )
Chandan Sharma

24

Bu soru oldukça eski olsa da, anahtarları tutarken birleştirme yapmak için başka bir olasılık eklemek istiyorum.

Mevcut dizilere anahtar / değer eklemenin yanı sıra +yapabileceğiniz işareti array_replace.

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

Sonuç:

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

İkinci dizi tarafından aynı tuşların üzerine yazılacaktır.
Ayrıca, array_replace_recursivealt diziler için de bunu yapan bir de vardır.

3v4l.org'daki canlı örnek


3

İki diziler kolayca kendi özgün indeksleme chaning olmadan eklenebilir veya sendika edilebilir + operatörü. Bu çok laravel ve codeigniter seçim açılır tam olarak yardımcı olacaktır.

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

Çıktı:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

1

Array_replace_recursive veya array_replace işlevlerini deneyin

$a = array('userID' => 1, 'username'=> 2);
array (
  userID => 1,
  username => 2
)
$b = array('userID' => 1, 'companyID' => 3);
array (
  'userID' => 1,
  'companyID' => 3
)
$c = array_replace_recursive($a,$b);
array (
  userID => 1,
  username => 2,
  companyID => 3
)

http://php.net/manual/en/function.array-replace-recursive.php

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.