изменение элементов массива, но с сохранением ключей индекса, php

#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' );