Помогите,перезапись элемента массива.

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, Сходу затрудняюсь ответить,но подумаюsmile Это точно решаемо?

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