LINUX.ORG.RU

php массив в цикле

 


0

1

Здравствуйте. Столкнулся с такой проблемой, что при каждой итерации массив присваивает определённый свой элемент переменной, но не перезаписывает его (что должно быть в моём понимании), а добавляет к присвоенному ранее значению в конец строки. Сколько итераций, столько и повторяется элемент массива в строке переменной, при этом переменная остаётся переменной. Как добиться перезаписи переменной с каждой итерацией?

Перемещено Zhbert из admin



Последнее исправление: alexisiumus (всего исправлений: 1)

Ответ на: php массив в цыкле от alexisiumus

Вот этот код был записан в файле с доступом 664, как так можно? Хотя.. владелец www-data

В каком файле он был записан?

anonymous
()
Ответ на: комментарий от alexmaru
foreach ($array as $a => $x) {
    $y = $str0[$i];
    $z = $str1[$i];
    
    if ($x == $y) {
       $array[$a] = $z; 
    }
}

Эффект такой же как и с моей версией… Хотя здесь конечно всё лаконичней. Правда я добавил кой чего, без которого этот код не работал бы в принципе. Вот как:

<?php
ini_set('error_reporting', E_ALL);
function zam_str($file, $str0, $str1) {
	$array = file("file");
	$count = count($array);
	$c = count($str0); 
	for ($i = 0; $i <= $c - 1; $i++) {
    foreach ($array as $a => $x) {
    $y = $str0[$i];
    $z = $str1[$i];
    
    if ($x == $y) {
		print_r($y);
       $array[$a] = $z; 
    }
}
}
	    $fp = fopen('../php/temp/temp.php', 'w+');
		fputs($fp, implode("", $array));
		fclose($fp);
		echo "<h1>Ok!</h1>";
}
$st_zn = array("aaaaa");
$n_zn = array("bbbbb");
zam_str("http://skil.su/2/file", $st_zn, $n_zn);
?>
alexisiumus
() автор топика
Ответ на: комментарий от alexisiumus

проблема в том, что вообще-вообще не понятно, что ты там хочешь получить.

Если подставить на место file, например

 $array = ['a', 'bbb', 'c', 'aaaaa', 'b', 'c bbbbb', 'd bbbbb'];

то ответ из твоей функции будет в виде

aaaaaa, bbb, c, bbbbb, b, c bbbbb, d bbbbb

окей, а что ты хочешь там увидеть?

alexmaru
()
Ответ на: комментарий от alexisiumus
function customReplace(string $fileContent, array $replace)
{
    return str_replace(array_keys($replace), $replace, $fileContent);
}

// Адрес файла в котором нужно поменять некоторые строки.
$fileContent = file_get_contents('file.txt');

// Функция создаёт новый файл с обновлённым содержимым.
file_put_contents('new_file.txt', customReplace($fileContent,

// Массив со строками(строкой) какие надо поменять.
 ['a' => 'b', 'b' => 'c', 'd' => 'e'])
);

alexmaru
()
Последнее исправление: alexmaru (всего исправлений: 1)
Ответ на: комментарий от alexmaru

Дело в том, что «file» это путь к файлу. функция file извлекает из этого файла строки и создаёт массив, который я и хочу оработать, заменив указанные строки массива, записав в другой файл.

alexisiumus
() автор топика
Ответ на: комментарий от alexmaru

Загвоздка в том, что если тупо включить «true» в условии младшего цикла то присвоение нужного элемента массива переменной происходит, только пр следующих итерациях эта переменная не затирается а «прирастает» тем же значением на число итераций.

alexisiumus
() автор топика
Ответ на: комментарий от alexmaru
function customReplace(string $fileContent, array $replace)
{
    return str_replace(array_keys($replace), $replace, $fileContent);
}

// Адрес файла в котором нужно поменять некоторые строки.
$fileContent = file_get_contents('file.txt');

// Функция создаёт новый файл с обновлённым содержимым.
file_put_contents('new_file.txt', customReplace($fileContent,

// Массив со строками(строкой) какие надо поменять.
 ['a' => 'b', 'b' => 'c', 'd' => 'e'])
);

Дело то в том, что задаче заменить один массив строк на другой массив строк. То есть эти два массива с одинаковым количеством элементов. Массив файла всегда с большим количеством элементов.

alexisiumus
() автор топика
Ответ на: комментарий от alexisiumus

Ну добавь https://www.php.net/manual/ru/function.array-replace.php по вкусу.

Ну а так - если тебе нужно что-то типа «если в этом массиве есть элементы с таким содержимым, то заменить вообще весь массив» - то это проверить каждый, используя in_array, а потом заменить сам массив на другой.

alexmaru
()
Последнее исправление: alexmaru (всего исправлений: 1)
Ответ на: комментарий от alexmaru

Ссори, не правильно выразился. Сравнить два (почти «одинаковых») массива. и там где отличия в элементах, заменить более свежим элементом.

alexisiumus
() автор топика
Ответ на: комментарий от alexmaru

Верней так:

  1. Массив файла.

  2. Массив «устаревших» строк.

  3. Массив «новых» строк.

  4. Мроисходит сравнение 1 и 2 массива.

  5. При совпадении строк первого и второго

  6. Записываются новые строки 3 массива в 1.

Примерно так.

alexisiumus
() автор топика
Ответ на: комментарий от burato

цЫкл!

Тоже мне граммотеи …
Учитесь!

Цыклоп, ципленок, цыстерна, Цытрикс, цытаты, …

anonymous
()
Ответ на: комментарий от no-such-file

Дружище, огромное спасибо! Один оказался компетентен. Действительно нужно было знаки служебные удалять! Оказывается и здесь можно помощь получить…

alexisiumus
() автор топика
Ответ на: комментарий от alexisiumus

Дружище, огромное спасибо! Один оказался компетентен. Действительно нужно было знаки служебные удалять! Оказывается и здесь можно помощь получить…

А вам в отладчике трудно было пройтись пошагово и понять почему алгоритм не работает?
Никогда не ищу помощи у других … /отучает думать/.

anonymous
()
Ответ на: комментарий от anonymous

Я на этом не зарабатываю и покупать отладчик пока не собрался. А был бы гордым, так вообще, думаю, мне ловить было-бы здесь нечего.

alexisiumus
() автор топика
Ответ на: комментарий от alexisiumus

А был бы гордым, так вообще, думаю, мне ловить было-бы здесь нечего.

Гордость здесь не причем.
Ваш вопрос от вашей лени.

anonymous
()
Ответ на: комментарий от alexisiumus

Я на этом не зарабатываю и покупать отладчик пока не собрался.

И что из этого следует?

anonymous
()
Ответ на: комментарий от alexisiumus

Дружище, огромное спасибо! Один оказался компетентен. Действительно нужно было знаки служебные удалять! Оказывается и здесь можно помощь получить…

Практика убеждает в том, что самому найти ответ - проще, быстрее и пользы больше, чем на форумах вопросы задавать.

anonymous
()
Ответ на: комментарий от alexisiumus

Дайте мне ссылку на функцию которая производит замену нескольких строк в файле и соответственно каждой своим вариантом

Почему ты такой тупой? Я тебе кинул уже на неё ссылку. Ты прочитал описание её? Да, она умеет сделать замену по двум массивам строк.

crutch_master ★★★★★
()
Ответ на: комментарий от alexisiumus
~
❯ php -r '$a = [1, 2, 3]; foreach ($a as &$v) ++$v; var_dump($a);' 
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  &int(4)
}

tz4678 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.