我有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
。
我该怎么做?
答案 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, ' ';
}
注意:这会在最后添加一个可能不需要的空间。如果是这种情况,请在循环中添加条件或执行以下操作:
echo implode(' ', array_map(function ($key) use ($array2) {
return $array2[$key] ?? $key;
// [PHP5] return isset($array2[$key]) ? $array2[$key] : $key;
}, $array1));
答案 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
)
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
与此不同的是这一点
$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;
}
答案 4 :(得分:1)
您可以内嵌第一个数组,然后使用str_replace替换内嵌字符串中第二个数组中的单词。
我认为不需要循环。
echo str_replace(array_keys($array2), $array2, implode(" ", $array1));
//hello bye see you fourth
Array_keys将从array2中获取键并进行查找,然后将array2中的值替换。