Опубликовано: 10 мая 20196 г Здравствуйте, я хочу переписать тут функцию получения настроек, сейчас оно реализовано чужим кодом: if ( isset( $this->botID ) and file_exists( \IPS\wc3\Bot::BOT_PATH . $this->botID . '/gcb/gcb.cfg' ) ) { $fh = fopen( \IPS\wc3\Bot::BOT_PATH . $this->botID . '/gcb/' . "gcb.cfg", 'r'); while(($buffer = fgets($fh, 4096)) !== false) { $buffer = trim($buffer); if(mb_strlen($buffer) > 3 && $buffer[0] != '#') { $index = mb_strpos($buffer, " ="); if($index !== false) { $key = trim(mb_substr($buffer, 0, $index)); $val = ""; if(mb_strlen($buffer) > $index + 3) { $val = trim(mb_substr($buffer, $index + 3)); } if(isset($key)) { $config[$key] = $val; } } } } fclose($fh); } Оно в принципе работает, но много строк, мне так не нравится. file_get_contents я думаю нет смысла использовать, чтение в строку мне не надо, нужен массив. $file = file(\IPS\wc3\Bot::BOT_PATH . $this->botID . '/gcb/gcb.cfg'); Сейчас мне нужно разделить массив на ключ => значение, есть разделитель в файле '=': http://prntscr.com/nmytio foreach ($file as $key) { $skey = trim(mb_substr($key, 0, mb_strpos($key, " ="))); $svalue = trim(mb_substr($key, mb_strpos($key, " ="))); $settings[$skey] = $svalue; } Что скажите? какой код лучше использовать? http://prntscr.com/nmyz9w Изменено 10 мая 20196 г пользователем TemKa_SD
Опубликовано: 10 мая 20196 г Автор Мне нужно комнаты поместить в массив 2 уровня, не получается, только одна комната заходит: $settings = array(); foreach ($file as $key) { $skey = trim(mb_substr($key, 0, mb_strpos($key, " ="))); $svalue = str_replace('= ', '', trim(mb_substr($key, mb_strpos($key, " =")))); if (static::garenaConfigurationConnectionKey($skey)) { $settings['rooms'] = [$svalue]; } else { $settings[$skey] = $svalue; } }
Опубликовано: 10 мая 20196 г У вас темы в последние время скатываются кудато от вопросов про IPS в сторону общего программирования.Создайте что-ли одну темы про разные вопросы программирования в разделе не относящее к делу если вопросы не касаются конкретно кода IPS. Често говоря не понимаю зачем тут строковые функции, когда можно разбить на key => value через функцию explode. foreach( $file as $row ) { $bits = array_map( "trim", explode( "=", $row, 2 ) ); $settings[ $bits[0] ] = $bits[1]; }
Опубликовано: 11 мая 20196 г Автор Да, спасибо, это то что нужно. Я пробовал через explode, но не сообразил как разбить на key => value.На счет тем, да, понял, это общая тема по php, в следующий раз учту при создании. P.S.: Не получается еще комнаты в массив перевести: до http://prntscr.com/nn3at4 после http://prntscr.com/nn3b7e foreach( $file as $row ) { $bits = array_map( "trim", explode( "=", $row, 2 ) ); if ( static::garenaConfigurationConnectionKey($bits[0])['key'] == "roomname" ) { $settings['rooms'] = [$bits[1]]; } else { $settings[$bits[0]] = $bits[1]; } } Одна комната остается. Я так понимаю, тут цикл нужен? Изменено 11 мая 20196 г пользователем TemKa_SD
Опубликовано: 11 мая 20196 г Не получается еще комнаты в массив перевести: до http://prntscr.com/nn3at4 после http://prntscr.com/nn3b7eПотому что у Вас$settings['rooms'] = [$bits[1]];И с каждым разом значение $settings['rooms'] перезаписывается. Если там должен быть массив, то и создавайте массив$settings['rooms'][] = [$bits[1]];
Опубликовано: 11 мая 20196 г А смысл? Использовать переменную счетчик $key с начальном значением 1. Или при присвоение первому элементу в массиве задать ключ 1.
Опубликовано: 11 мая 20196 г Автор Я вне формы передаю стандартные значения, указал true, записалось как 1. Мне нужно именно true, как иправить в '' вроде работает. Изменено 11 мая 20196 г пользователем siv1987
Опубликовано: 11 мая 20196 г @TemKa_SD, на какой хрен вы две строчки кода грузите скриншотами? Всю текстовую информацию пишите в теме обрамляя в ббкоды. Не нужно засорять форум этими скриншотами.
Опубликовано: 11 мая 20196 г Автор Мне казалось скринами понятней, и можно заскринить не только ту часть когда о которой идет речь, но и остальное.
Здравствуйте, я хочу переписать тут функцию получения настроек, сейчас оно реализовано чужим кодом:
if ( isset( $this->botID ) and file_exists( \IPS\wc3\Bot::BOT_PATH . $this->botID . '/gcb/gcb.cfg' ) ) { $fh = fopen( \IPS\wc3\Bot::BOT_PATH . $this->botID . '/gcb/' . "gcb.cfg", 'r'); while(($buffer = fgets($fh, 4096)) !== false) { $buffer = trim($buffer); if(mb_strlen($buffer) > 3 && $buffer[0] != '#') { $index = mb_strpos($buffer, " ="); if($index !== false) { $key = trim(mb_substr($buffer, 0, $index)); $val = ""; if(mb_strlen($buffer) > $index + 3) { $val = trim(mb_substr($buffer, $index + 3)); } if(isset($key)) { $config[$key] = $val; } } } } fclose($fh); }Оно в принципе работает, но много строк, мне так не нравится.
file_get_contents я думаю нет смысла использовать, чтение в строку мне не надо, нужен массив.
Сейчас мне нужно разделить массив на ключ => значение, есть разделитель в файле '=': http://prntscr.com/nmytio
foreach ($file as $key) { $skey = trim(mb_substr($key, 0, mb_strpos($key, " ="))); $svalue = trim(mb_substr($key, mb_strpos($key, " ="))); $settings[$skey] = $svalue; }Что скажите? какой код лучше использовать? http://prntscr.com/nmyz9w
Изменено пользователем TemKa_SD