Есть файл 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'
В чем загвоздка?
Загвоздка в том, что вы неправильно заменяете значения в строке. Функция 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 и точку с запятой ;.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости