如果在第二个数组上找到第一个数组的值,则替换并回显它

时间:2019-03-27 21:51:50

标签: php arrays

我有2个数组:

$array1 = array('first', 'second', 'third', 'fourth');
$array2 = array('second' => 'bye', 'first' => 'hello',  'third' => 'see you', 'fifth' => 'good evening');

我像这样回声$array1的内容

foreach ($array1 as $extra) {
echo $extra; }

我要做的是每次在回显$extra之前检查是否在$array2中找到了输出。如果是,则改为回显array2的值。

因此,在上面的示例中,我要回显first second third fourth而不是hello bye see you fourth

我该怎么做?

5 个答案:

答案 0 :(得分:2)

您可以访问$array2[$key]并使用null-coalescing operator,因为如果$array1中的键不存在,显然您想回到$array2的值

foreach ($array1 as $key) {
  echo $array2[$key] ?? $key, ' ';
  // [PHP5] echo isset($array2[$key]) ? $array2[$key] : $key, ' ';
}

演示:https://3v4l.org/3vQYt

注意:这会在最后添加一个可能不需要的空间。如果是这种情况,请在循环中添加条件或执行以下操作:

echo implode(' ', array_map(function ($key) use ($array2) { 
  return $array2[$key] ?? $key;
  // [PHP5] return isset($array2[$key]) ? $array2[$key] : $key;
}, $array1));

演示:https://3v4l.org/VCDVt

答案 1 :(得分:2)

你可以

$array1 = array('first', 'second', 'third', 'fourth');
$array2 = array('second' => 'bye', 'first' => 'hello',  'third' => 'see you', 'fifth' => 'good evening');
print_r(array_intersect_key( $array2 ,array_flip($array1)));

输出

Array
(
    [second] => bye
    [first] => hello
    [third] => see you
)

Sandbox

  

array_intersect_key()返回一个数组,其中包含array1的所有条目,这些条目的所有参数中都包含键。   https://www.php.net/manual/en/function.array-intersect-key.php

  

array_flip()以翻转顺序返回一个数组,即数组中的键成为值,而数组中的值成为键。   https://www.php.net/manual/en/function.array-flip.php

更新

  

我知道,但是array1是“字符串”。 Array2是替代品。看到问题:我想向你好打招呼再见,您第四次

$array1 = array('first', 'second', 'third', 'fourth');
$array2 = array('second' => 'bye', 'first' => 'hello',  'third' => 'see you', 'fifth' => 'good evening');

echo implode(' ', array_intersect_key( array_merge(array_combine($array1,$array1), $array2) ,array_flip($array1)));

输出

hello bye see you fourth

Sandbox

与此不同的是这一点

 $array2 = array_merge(array_combine($array1,$array1), $array2)

这是用array_combine创建一个新数组,该数组具有与值相同的键。在这种情况下:

array('first'=>'first', 'second'=>'second', 'third'=>'third',  'fourth'=>'fourth')

然后我们使用以下事实:合并2行时,第二个数组将覆盖第一行的键,因此我们将其与原始$array2

合并
$array2 = array('second' => 'bye', 'first' => 'hello',  'third' => 'see you', 'fourth'=>'fourth', 'fifth' => 'good evening');

因此,通过执行此“额外”步骤,我们确保$array1中的所有元素都在$array2中存在-$array1的顺序也得以保留-在这种情况下,它仅添加了{{ 1}},但这正是相交工作所需要的。

然后我们将其内爆。

UPDATE2

这是使用'fourth'=>'fourth'preg_filter的更简单的

preg_replace

输出

$array1 = array('first', 'second', 'third',  'fourth');
$array2 = array('second' => 'bye', 'first' => 'hello',  'third' => 'see you', 'fifth' => 'good evening');

echo implode(' ',preg_replace(preg_filter('/(.+)/', '/(\1)/i', array_keys($array2)), $array2, $array1));

它与hello bye see you fourth 非常相似,因此我不想将其发布为答案。但这确实比str_replace有一些好处。例如

str_replace

现在我们有echo implode(' ',preg_replace(preg_filter('/(.+)/', '/\b(\1)\b/i', array_keys($array2)), $array2, $array1)); 个单词边界,这意味着\b将不匹配first等。

对不起,我真的很喜欢做这样的事情,对我来说这很“有趣”。

答案 2 :(得分:1)

foreach ($array1 as $extra) {
      foreach ($array2 as $key=>$value) {
          if($extra==$key){
               echo $value;
          }
      }
}

类似的东西

答案 3 :(得分:1)

只需使用isset

foreach($array1 as $e) {
    $val = isset($array2[$e]) ? $array2[$e] : $e;
    echo $val;
}

文档可以在这里找到:https://www.php.net/manual/en/function.isset.php

答案 4 :(得分:1)

您可以内嵌第一个数组,然后使用str_replace替换内嵌字符串中第二个数组中的单词。
我认为不需要循环。

echo str_replace(array_keys($array2), $array2, implode(" ", $array1));
//hello bye see you fourth

Array_keys将从array2中获取键并进行查找,然后将array2中的值替换。

https://3v4l.org/UIWV0