Помогите,перезапись элемента массива.
1.
Евгений (15.06.2015 / 21:44)
Народ помогите нужно перезаписать только один элемент массива...массив вида
10:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:10
11:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:11
12:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:-:||:12
Подскажите код
2.
Вантуз-мен (16.06.2015 / 00:05)
что именно из этого массив элемент между :||: в строке или в файле?
3.
Евгений (16.06.2015 / 00:33)
массив в txt файле хранится,элементы между сплитом. вот такой код получился,но почему то перезаписывает элемент в первый символ.Что не так подскажите.
$x=(int)$_GET['x']; $y=(int)$_GET['y'];
if($_GET['select']!='' and is_file($cms.'img/part_map/'.$_GET['select'])){
$intmaps=@file($cms.'world/data/map/map.txt');
$count=count($intmaps); //подсчитываем количество строк
$line_map=$x; // строка
for($i=0;$i<$count;$i++) //создаём цикл,кол-во оборотов = количиству строк
{
if($i!=$line_map){fwrite($fp,$file[$i]);}else{
$fmap=explode(":||:",$intmaps[$x]);
$selest_part=$_GET['select'];
$selest_part=substr($selest_part,0,-4);
$fmap[$y]=$selest_part; $intmaps[$x]=implode(":||:",$fmap);
$fp=fopen($cms.'world/data/map/map.txt',"w"); //очищаем файл
foreach($intmaps as $key => $value){
if($value!=""){@fputs($fp,$value);}}
}
}fclose($fp); //закончили работать с файлом
4.
Антон (16.06.2015 / 05:14)
1.
dzhems, я думаю если ты объяснишь более подробно что тебе надо, то помощь получишь намного быстрее.
Выложи пример файла, размером 5 строк с самого начала и между какими символами вставлять\заменять.
5.
Вантуз-мен (16.06.2015 / 11:38)
3.
dzhems, я не могу понять это полностью массив или строки, если полностью почему тогда переводы строк
в какой именно строке тебе нужно поменять и какой именно элемент
то что ты написал это не массив это обычная строка (string)
6.
Вантуз-мен (16.06.2015 / 11:48)
В старом моторе были неплохие функции для работы с такими видами данных в файлах
к примеру
https://github.com/visavi/wap-motor/blob/master/includes/functions.php#L275
поиск элемента в строках возвращает данные строки массив и номер строки
только замени сепаратор с | на то что тебе нужно в твоем случае :||:
https://github.com/visavi/wap-motor/blob/master/includes/functions.php#L294
Чтение строки из файла передаешь номер строки возвращается массив (тоже поменяй сепаратор)
ну и замена строки в файле
https://github.com/visavi/wap-motor/blob/master/includes/functions.php#L239
7.
Евгений (16.06.2015 / 13:01)
6.
Vantuz, Спасибо буду разбираться.
8.
Вантуз-мен (16.06.2015 / 16:47)
7.
dzhems, на работе задач не было вот быстренько накидал
https://github.com/visavi/flystring
можешь через композер установить
9.
Евгений (16.06.2015 / 18:02)
5.
Vantuz, Массив-матрица 20 на 20 к примеру...в 15 строке 16 ячейку меняем...Всё остальное не изменяется соответственно
10.
Вантуз-мен (16.06.2015 / 18:36)
Тем классом что я написал будет вот так
<?php
$fly = new Visavi\FlyString('test.txt', ':||:');
$string = $fly->read(15);
$string[16] = 'new value';
array_pop($string);
$fly->replace(15, $string);
только учти что нумерация начинается с нуля, тебе скорее всего нужно 14 и 15
я потом оптимизирую чтобы массив возвращался без перевода строки и не нужно было удалять последний элемент array_pop($string);
или вообще сделаю метод замены ячейки в строке
Но сейчас я хочу переписать чтобы открытие файла происходило не через file, а через fopen и уже там управлять курсором, это более безопасно, сэкономит память и можно будет работать с большими файлами
но к твоей задаче это не относится
11.
Евгений (16.06.2015 / 19:21)
Использую функцию,что написано выше - всё должно работать,но просто перезаписывает исходные данные в файле,в чём может быть дело не подскажите?
12.
Евгений (16.06.2015 / 19:36)
if ($line === $key) {
Это опечатка в классе(3 равно) или так и должно?
13.
Евгений (16.06.2015 / 20:28)
Всё ура,ещё вчерашний мой код заработал...вместо $intmaps[$i] file[i] было написано.Невнемательность.вот рабочий кусок может кому пригодится...
[color=#0000ff]$x=(int)$_GET['x']; $y=(int)$_GET['y'];
if($_GET['select']!='' and is_file($cms.'img/part_map/'.$_GET['select'])){
$select_part=$_GET['select']; $select_part=substr($select_part,0,-4);
echo 'Координаты: '.$x.' - '.$y.' -s- '.$select_part.'<br/>';
$intmaps=@file($cms.'world/data/map/map.txt');
$count=count($intmaps); //подсчитываем количество строк
$fp=fopen($cms.'world/data/map/map.txt',"w"); //очищаем файл
for($i=0;$i<$count;$i++) //создаём цикл,кол-во оборотов = количиству строк
{
if($i!=$x){fwrite($fp,$intmaps[$i]);}else{
$fmap=explode(":||:",$intmaps[$x]);
$fmap[$y]=$select_part; $intmaps[$x]=implode(":||:",$fmap);
fwrite($fp,$intmaps[$i]);
}
}fclose($fp); //закончили работать с файлом[/color]
14.
Вантуз-мен (16.06.2015 / 22:30)
12.
dzhems, === проверка на идентичность, а == обычное сравнение
вот тебе вопрос на засыпку
<?php
$x = ?;
if ($x == 1 && $x == 2) {
echo 'чему должна быть равна $x чтобы это условие выполнилось';
}
Добавлено через 02:27 сек.
11.
dzhems, не знаю что там перезаписывает, я тестировал все работает нормально
15.
Евгений (16.06.2015 / 23:58)
14.
Vantuz, Сходу затрудняюсь ответить,но подумаю
Это точно решаемо?
16.
Вантуз-мен (17.06.2015 / 00:09)
15.
dzhems, ну я бы не спрашивал если было бы не решаемо
17.
Вантуз-мен (17.06.2015 / 17:14)
Переписал класс, вот современный способ перезаписи ячейки 16 в строке 15
<?php
$fly = new Visavi\FlyString('test.txt', ':||:');
$fly->cell(14, 15, 'new value');
и все больше никаких действий не нужно
кому интересно класс FlyString лежит на гитхабе
https://github.com/visavi/flystring
URL:
https://visavi.net/topics/42420