Не могу перезаписать в файле значение внутри многомерного массива

197
11 января 2018, 23:26

Есть файл configs.php в котором хранится многомерный массив с данными, например:

<?php
class configs {
    public static $array = [
        ['subarray0','Heading 0',['0-0','0-1']], // configs::$array[0] =>
        ['subarray1','Heading 1',['1-0','1-1']] // configs::$array[1] =>
    ];
}
?>

И есть например файл main.php который перезаписывает данные в файле configs.php:

<?php
$fileToBeOverwritten = __DIR__ .'/configs.php';
require_once $fileToBeOverwritten;
$currentSubarray = configs::$array[1]; // берем текущий подмассив с индексом 1 с общего массива $array
configs::$array[1][1] = 'New Heading 1'; // меняем 'Heading 1' на 'New Heading 1'
$changedSubarray = configs::$array[1]; // определяем изменённый подмассив
$currentFileSource = file_get_contents($fileToBeOverwritten); // берем текущий код configs.php
$changedFileSource = str_replace($currentSubarray,$changedSubarray,$currentFileSource); // заменяем в коде файла текущий подмассив изменённым подмассивом
file_put_contents($fileToBeOverwritten,$changedFileSource); // перезаписываем изменённый код файла
?>

В данном случае все работает как и требуется.

Но вот когда пытаюсь в подмассиве configs::$array[1] перезаписать не строку 'Heading 1' а какое то значение внутри вложенного массива ['1-0','1-1'] тогда не срабатывает.

Т.е. вот такой код

...
$currentSubarray = configs::$array[1];
configs::$array[1][2][0] = 'New 1-0'; // берём в подмассиве с индексом 1 третий элемент, который является вложенным массивом и пытаемся поменять в нем значение первого элемента
$changedSubarray = configs::$array[1];
...

не перезаписывает значение '1-0' новым значением 'New 1-0'

В чем загвоздка?

Answer 1

Загвоздка в том, что вы неправильно заменяете значения в строке. Функция str_replace принимает в качестве аргументов строки или массивы строк. Значения, которые не являются строками, например такие, как ваш вложенный массив, приводятся к строкам (получается мы ищем строку 'Array'). В результате значение в массиве вы поменяли, но замена в строке отработала не так как вы надеялись.

В любом случае str_replace это не дело, ведь может оказаться, что значения в разных массивах будут одинаковые, и тогда замена отработает неправильно даже для строк.

А правильно будет перезаписать весь файл configs.php целиком:

$changedFileSource = '<?php
class configs {
    public static $array = ' . var_export($changedConfigs, true) . ';
 }
';
file_put_contents($fileToBeOverwritten, $changedFileSource);

Но вообще генерировать такой код, возможно, не самая хорошая идея и лучше воспользоваться возможностью вернуть значение из подключаемого файла:

<?php
// configs.php
return [
    ['subarray0','Heading 0',['0-0','0-1']],
    // ...
];

И подключать так:

<?php
// main.php
$configs = require __DIR__ . '/configs.php';

Тогда генерировать придётся только дескриптор <?php, return и точку с запятой ;.

READ ALSO
Баг в обрисовке букв - ограничение на количество точек кривой?

Баг в обрисовке букв - ограничение на количество точек кривой?

Есть некоторый текст, который выводится на пустую картинку с помощью annotateImageЗадается толщина обводки таким образом:

223
Запись переменной в mysql из текстового поля через php

Запись переменной в mysql из текстового поля через php

ЗдравствуйтеПодскажите как правильно передать переменную

252
Получить токен страницы на facebook

Получить токен страницы на facebook

Мне нужно получить json фаил со отзывами, о странице, сейчас моя ссылка выглядит так:

244
Плагин CodeSniffer для Atom перестал работать

Плагин CodeSniffer для Atom перестал работать

На ОС Ubuntu я установил и настроил плагин phpcs в редакторе Atom, который долго и исправно показывал ошибки несоответствия стандарту PSR-2После того,...

224