2013-06-12 41 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