2013-06-12 68 views
1

我有containts這樣逗號分隔值的變量:$str = "1,5";陣列替換數字和關聯

爲了將其轉換爲陣列我有以下代碼:

$str = "1,5"; 
$replacements = explode(',', $str); 

現在陣列看起來像以下:

Array 
(
    [0] => 1 
    [1] => 5 
) 

我有這樣的另一個數組:$base = array('1'=>'Bread','5'=>'Butter');

我所試圖做的是通過關聯數組的值替換數字陣列的值高於基於關聯數組的key和數字陣列的價值,它應該看起來像以下:

// This is what I am trying to achive 
Array 
(
    [0] => Bread // because 1 = Bread in the assoc. array 
    [1] => Butter // because 5 = Butter in the assoc. array 
) 

爲了實現這一目標,我想下面的代碼:

$str = "1,5"; 
$replacements = explode(',', $str);   
$base = array('1'=>'Bread','5'=>'Butter');   
$basket = array_replace($base, $replacements);  
print_r($basket); 

但它給我下面的輸出:

Array 
(
[1] => 5 
[5] => Butter 
[0] => 1 
) 

你能告訴我如何解決這個問題嗎?

+0

所以,你要通過$替代排序$基地? – Orangepill

回答

6
$str = "1,5"; 
$replacements = explode(',', $str);   
$base = array('1'=>'Bread','5'=>'Butter'); 
$basket = array(); 

foreach($replacements as $value) { 
    $basket[]=$base[$value]; 
} 
+0

這正是我會這樣做的方式。你擊敗了我的答案。 – amaster

+0

@ amaster507 :-) –

+0

我低估了答案,因爲PHP函數在這裏做的原因,請參閱@Brad Christie答案。它也不是完全安全的 – MKroeders

4

array_replace比較兩個數組的鍵,而不是鍵的值。

嘗試array_map

$basket = array_map(function($a) use($base){ 
    return $base[$a]; 
}, $replacements); 

DEMO:http://ideone.com/xPhoZP

+0

我確實喜歡這個解決方案,即使它依賴於PHP> = 5.3。 ; p –

+1

@BradChristie:我希望沒有人使用5.2或更低版本:-P –

3

看一看 array_combine。該方法允許您使用一個數組作爲鍵,另一個數組作爲值。那麼你可以使用 array_values($base)只抓取值部分並從那裏組合。

好吧,咖啡夫婦喝了幾口後,這裏亞去使用內置的方法:

  • array_intersect_keys就會從一個陣列基於從另一個關鍵的比賽相匹配。
  • array_fill_keys將您的$replacements數組轉換爲array(1=>0,5=>0),因此我們可以在array_intersect_keys中使用它。

代碼:

$str = "1,5"; 

$replacements = explode(',', $str); 
$base = array(
    1 => 'Bread', 
    2 => 'Gravy', 
    3 => 'Stuffing', 
    4 => 'Turkey', 
    5 => 'Butter', 
    6 => 'Squash' 
); 

var_dump(array_intersect_key($base, array_fill_keys($replacements,0))); 

結果:

array(2) { 
    [1]=> 
    string(5) "Bread" 
    [5]=> 
    string(6) "Butter" 
} 

Example

和@nickb在評論中指出,如果你想的鑰匙,是[0],[1]只是調用array_values結果。另外,如果訂單很重要,可能在$replacements之前撥打sort,然後再進入提取。

+0

很好的使用PHP函數他們自己 – MKroeders

+0

如果'$ str'是'「5,1」'? –

+0

@RocketHazmat:基於最新的更新,將其啓用。 ;-) –

1

試試這個:

$basket=array(); 
foreach($replacements as $value) { 
    array_push($basket, $base[$value]); 
} 
print_r($basket); 

希望它的作品。

2

如果array_flip()explode()倒是數組,你可以得到一些有趣的結果:

$flipped = array_flip(explode(',', $str)); 

結果:

Array 
( 
    [1] => 0 
    [5] => 1 
) 

現在,你可以相交的$base陣列和$flipped按鍵陣列array_intersect_key()

$intersection = array_intersect_key($base, $flipped); 

結果:

Array 
( 
    [1] => Bread 
    [5] => Butter 
) 

然後,只需重新索引與array_values()(可能會或可能不會是必要的,如果你不關心的指標,則省略此步驟)

$replacements = array_values($intersection); 

或者,在一個單行:

$str = "1,5"; 
$base = array('1'=>'Bread','5'=>'Butter'); 
$replacements = array_values(array_intersect_key($base, array_flip(explode(',', $str)))); 

prints

Array 
( 
    [0] => Bread 
    [1] => Butter 
) 
+1

'array_filp'?非常聰明! +1 –

+0

感謝您的回答。如果'$ str =「5,1」;'它不提供正確的順序。 –

+0

@black_belt - 如果這個順序很重要,這是一個非常重要的細節,你從你的問題中省略了:)我的解決方案是使用'$ base'內的順序作爲優先級,如果你的願望是'$ str' ,那麼可以進行更改。 – nickb