数组替换数字和关联

时间:2013-06-12 19:59:19

标签: php

我有一个变量,它包含逗号分隔值,如下所示:$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
) 

你能告诉我如何解决这个问题吗?

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

array_replace比较两个数组的键,而不是键的值。

尝试array_map

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

DEMO:http://ideone.com/xPhoZP

答案 2 :(得分: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即可。此外,如果订单很重要,可以在sort之前调用$replacements,然后再进行提取。

答案 3 :(得分:2)

如果您explode()得到array_flip()数组,您可以获得一些有趣的结果:

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

<强>结果:

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

现在,您可以使用array_intersect_key()$base数组和$flipped数组与键相交:

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

答案 4 :(得分:1)

试试这个:

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

希望它有效。