#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 будут заменами.
Комментарии:
1. Не работает, если ключи содержат одинаковые подстроки. Например. если вы заменяете
first
наfirstsecond
.2. @Jeto Верно. Для str_replace существуют ограничения.