1

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

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

4

5 回答 5

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

foreach($replacements as $value) {
    $basket[]=$base[$value];
}
于 2013-06-12T20:02:38.830 回答
4

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

试试array_map

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

演示:http: //ideone.com/xPhoZP

于 2013-06-12T20:03:17.700 回答
4

看看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"
}

例子

正如@nickb 在评论中指出的那样,如果您希望键[0],[1]只是调用array_values结果。此外,如果订单很重要,可以sort$replacements开始取货之前先打个电话。

于 2013-06-12T20:03:18.620 回答
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))));

打印

Array 
( 
    [0] => Bread 
    [1] => Butter 
)
于 2013-06-12T20:17:20.217 回答
1

尝试这个:

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

希望它有效。

于 2013-06-12T20:07:37.973 回答