2009-10-23 16 views
3

想象一下,我想創建另一個陣列像這樣的數組:最佳方式,如果數組鍵存在

$array = array('bla' => $array2['bla'], 
       'bla2' => $array2['bla2'], 
       'foo' => $array2['foo'], 
       'Alternative Bar' => $array['bar'], 
       'bar' => $array2['bar']); 

什麼是測試無論是$數組2的最佳方法有指數我傳遞到另一個數組,而不使用if來添加每個索引。

要注意,從$陣列的關鍵可以從$數組2

+0

如果索引不存在於$ array2中會發生什麼? – 2009-10-23 09:12:56

+0

然後,將該值設置爲null,或$ array中的索引不應存在。 – LuRsT 2009-10-23 09:16:35

回答

2

我所做的是用我想要的鍵爲陣列創建一個模板,

$template = array('key1', 'key2', 'key3'); 

然後,我會合並模板與其他陣列,如果任意鍵被第二陣列中丟失,那麼關鍵的值是零,這樣一來我沒有警告的問題告訴我有關偏移值。

$template = array('key1', 'key2', 'key3'); 
$array = array_merge($template, $otherarray); 
1

如果我理解正確的不同...

$a = array('foo' => 1, 'bar' => 2, 'baz' => 3); 
$keys = array('foo', 'baz', 'quux'); 

$result = array_intersect_key($a, array_flip($keys)); 

這將只是挑出從$一個

+0

如果密鑰不匹配,則不起作用。 – LuRsT 2009-10-23 10:08:18

1

現有密鑰一種可能性是:

$array = array(
     'bla' => (isset($array2['bla']) ? $array2['bla'] : ''), 
     'bla2' => (isset($array2['bla2']) ? $array2['bla2'] : ''), 
     'foo' => (isset($array2['foo']) ? $array2['foo'] : ''), 
     'xxx' => (isset($array2['yyy']) ? $array2['yyy'] : ''), 
     'bar' => (isset($array2['bar']) ? $array2['bar'] : '') 
    ); 

如果這種情況發生得更加動態,我會建議t使用array_intersect_key,就像soulmerge發佈一樣。但是這種方法會有一個折衷,即只能使用具有相同密鑰的陣列。

由於2個數組中的鍵可能會有所不同,因此可以使用映射數組構建半動態映射來映射數組之間的鍵。您至少要列出陣列中不同的鍵。

//key = key in $a, value = key in $b 
$map = array( 
    'fooBar' => 'bar'  
); 

$a = array(
    'fooBar' => 0, 
    'bla' => 0, 
    'xyz' => 0 
); 

$b = array(
    'bla' => 123, 
    'bar' => 321, 
    'xyz' => 'somevalue' 
); 

foreach($a as $k => $v) { 
    if(isset($map[$k]) && isset($b[$map[$k]])) { 
     $a[$k] = $b[$map[$k]]; 
    } elseif(isset($b[$k])){ 
     $a[$k] = $b[$k]; 
    } 
} 

這樣你只需要在$ map中定義不同的鍵。

+0

那麼比這更動態的東西是不可能的? :'( – LuRsT 2009-10-23 10:29:34

+0

From docs:'isset()對於NULL值對應的數組鍵不返回TRUE,而array_key_exists()不返回TRUE。 – Sebastian 2013-07-09 05:11:29

0

如果我理解你正確,你想從array1中提取某些鍵並將不存在的鍵設置爲空字符串。這樣來做:

# Added lots of newlines to improve readability 
$array2 = array_intersect_key(
    array(
     'bla' => '', 
     'bla2' => '', 
     'foo' => '', 
     # ... 
    ), 
    $array1 
); 
0

或許這...

$array = array(); 
foreach ($array2 as $key=>$val) 
{ 
    switch ($key) 
    { 
     case 'bar': 
      $array['Alternative bar'] = $val; 
      break; 
     default: 
      $array[$key] = $val; 
      break;    
    } 
} 

對於任何「特殊」數組索引的,使用case條款,否則剛纔複製的價值。