#php
#php
Вопрос:
У меня возникла некоторая проблема с индексными ключами. У меня есть массив, который содержит URL-адреса. Итак, мне нужно отредактировать элементы в этом массиве. И замените старые элементы новыми. Но новые элементы приходят с новыми ключами индекса (это нормальная вещь.) На самом деле, я хочу передать ключ старого элемента новому. Есть простой пример того, что я делаю…
мой массив $urls
приведен ниже.
[0]=>
string(34) "helloworld.com/"
[1]=>
string(34) "exampleworld.com/"
[2]=>
string(26) "new-exampleworld.com/"
теперь отредактируйте и отмените установку старых элементов.
foreach($urls as $k => $val){
$urls[] = $val . outline;
unset($urls[$k]);
}
Таким образом, выходные данные выглядят так
[3]=>
string(34) "helloworld.com/outline"
[4]=>
string(34) "exampleworld.com/outline"
[5]=>
string(26) "new-exampleworld.com/outline"
Проблема здесь в следующем добавлении нового элемента. Но на самом деле, я хочу изменить его на отредактированный. Потому что мне нужно сохранить индексные ключи одинаковыми … можно ли в любом случае добавить, изменить новые элементы на старые. НЕ добавление next.
Комментарии:
1. $urls[$k] = $ val . схема;
2. И удалите
unset($urls[$k]);
3. Почему бы не присвоить значения напрямую? Возможно
$urls[$k] = $val . "outline";
?
Ответ №1:
Попробуйте это
print_r(preg_filter('/$/', 'outline', [
'helloworld.com/',
'exampleworld.com/',
'new-exampleworld.com/',
]));
вывод
Array
(
[0] => helloworld.com/outline
[1] => exampleworld.com/outline
[2] => new-exampleworld.com/outline
)
Итак, в вашем случае (preg_filter — это своего рода трюк для префикса, суффиксирования массивов):
$urls = preg_filter('/$/','outline',$urls);
/$/
Является регулярным выражением или шаблоном для сопоставления. В этом случае $
просто совпадает с концом строки, а второй аргумент заменяет его на outline
. В принципе, я должен упомянуть, что вы не можете заменить конец строки. Это просто факт, что строка заканчивается, плюс $
не захватывает никаких символов для замены… но я отвлекся.
В вашем исходном коде
foreach($urls as $k => amp;$val){
$val .= 'outline';
}
Используйте amp;
передачу по ссылке, чтобы обновить ее напрямую. Ссылки, не углубляясь слишком глубоко, подобны указателю на фактическую переменную. Итак, это в основном говорит об использовании массива, а не его копии. Таким образом, мы можем просто присвоить (или добавить) строку, и нам не нужно выполнять какие-либо поиски в исходном массиве или создавать новый массив и т.д.
Надеюсь, это поможет.
Комментарии:
1. Это хороший и полный ответ, этот должен быть принятым
Ответ №2:
Вы создаете новые индексы, а затем удаляете старые. Такое поведение является нормальным.
Если вы просто хотите изменить значения, то… измените их
в примере :
foreach($urls as $k => $val){
$urls[$k] = $val . "outline";
}
Ответ №3:
Если вы просто хотите изменить значение и сохранить индекс, вы можете выполнить передачу по ссылке в foreach
<?php
$urls =["google"=>"google.com","Facebook.com",1=>"yahoo.com"];
print_r($urls);
// For updating values
foreach($urls as amp;$url)
{
$url = $url ."\new_url";
}
echo "<br>";
print_r($urls);
?>
Ответ №4:
array_walk, вероятно, хороший способ сделать это.
Вы применяете функцию к каждому элементу массива. Итак, этот код:
<?php
$urls = array( 'helloworld.com/', 'exampleworld.com/', 'new-exampleworld.com/' );
array_walk($urls, function ( amp;$item1, $key ) {
$item1 = $item1 . 'outline';
});
print_r( $urls );
?>
выведет это:
Array
(
[0] => helloworld.com/outline
[1] => exampleworld.com/outline
[2] => new-exampleworld.com/outline
)
Если функция должна быть более сложной или повторно используемой, лучше не использовать анонимную функцию, как я сделал выше.
Сделайте это следующим образом (и при необходимости вы можете передать другой суффикс):
function add_postfix( amp;$item, $key, $suffix ) {
$item1 = $item . $suffix;
};
array_walk( $urls, 'add_postfix', 'outline' );