Если значение первого массива найдено во втором массиве, замените и повторите его

#php #arrays

#php #массивы

Вопрос:

У меня есть 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 .

Как я могу это сделать?

Комментарии:

1. if (isset($array2[ $extra ])) { .. /* exist */ ..}

Ответ №1:

Вы можете сделать

 $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 также сохраняется — в этом случае он просто добавляет 'fourth'=>'fourth' , но это именно то, что нам нужно для работы intersect.

Затем мы просто взрываем его.

UPDATE2

Это проще, используя 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 не будут совпадать firstone и т.д.

Извините, мне действительно нравится делать подобные вещи, для меня это «весело».

Комментарии:

1. Нет fourth

2. @Andreas — в $array2 также нет forth. Вы не можете вывести что-то, чего не существует.

3. Я знаю, но это array1, который является «строкой». Array2 — это замены. Смотрите вопрос: Я хочу повторить hello bye see you fourth

4. Хорошо, я могу это исправить и сохранить в одной строке 🙂

5. Я не уверен, что вы сможете 🙂 Я думал о подобном решении раньше. Обратите внимание на служебный цикл в фоновом режиме

Ответ №2:

Вы можете получить доступ к $array2[$key] и использовать оператор объединения с нулем, поскольку вы, очевидно, хотите вернуться к значению из $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. Здравствуйте, спасибо вам за это, не могли бы вы, пожалуйста, помочь мне записать это на php 5.6 вместо 7?

2. Еще раз спасибо. Последний вопрос, я только что заметил, что массив, который я разнесу, выглядит следующим образом array(23) { [0]=> string(3) "ABS" [1]=> string(3) "ESP" [2]=> string(8) "Airbag 6" является ли эта структура чем-то, с чем код не может справиться?

3. @EnexoOnoma Ты имеешь в виду $array1 или $array2 ? Если это ваше, $array1 тогда все в порядке, если это ваше, $array2 тогда значениями из $array1 должны быть сами эти числовые индексы. Вы можете использовать 3v4l.org чтобы показать мне пример, если хотите.

4. приведенный выше пример массива является моим array1 и разбит на строки типа ABS,ESP,Airbag 6 . формат часто он array2 похож на тот, который я опубликовал в вопросе. К сожалению, я не могу заставить это работать, хотя

5. эй, я заставил это работать! спасибо за вашу помощь и руководство!

Ответ №3:

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

что-то вроде этого

Ответ №4:

Просто используйте isset :

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

Документ можно найти здесь:https://www.php.net/manual/en/function.isset.php

Ответ №5:

Вы можете просто имплантировать первый массив, а затем использовать str_replace для замены слов из второго во имплантированной строке.
На мой взгляд, циклы не нужны.

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

Array_keys возьмет ключи из array2 и выполнит их поиск, тогда значения из array2 будут заменами.

https://3v4l.org/UIWV0

Комментарии:

1. Не работает, если ключи содержат одинаковые подстроки. Например. если вы заменяете first на firstsecond .

2. @Jeto Верно. Для str_replace существуют ограничения.