LINUX.ORG.RU

Массивы в PHP

 ,


0

1
$str_search = array(
"{guest}",
"{author}",
"{id}",
"{who}"
);
$str_replace = array(
"$guest",
"$row['author']",
"$row['id']",
"$row['who']"
);

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

★★

Последнее исправление: CYB3R (всего исправлений: 1)

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

Я бы сказал, что ошибка скорее закралась в мозге, а не в массиве. Это что за бред собачий? Ты хотел вот этого?

$str_replace = array(
'$guest',
'$row["author"]',
'$row["id"]',
'$row["who"]'
);
BaBL ★★★★★
()

я думаю что скорее всего в массиве, а именно во втором, вопрос следующий: можно ли так записывать данные в массив?

да, можно. Только получится совсем не то, чего ты хочешь.

Если так нельзя, то каким способом можно?

телепаты в отпуске.

но если ты думаешь, что {guest} будет волшебным способом меняться на содержимое $guest, то у меня для тебя плохие новости.

drBatty ★★
()
Ответ на: комментарий от BaBL

Я и так пробывал, просто сомневался в правильности написания. Видимо ошибка не в этом. Вот код:

$message_tpl = file_get_contents('/var/www/themes/standart/message.tpl');
include ('/var/www/engine/db.php');
$get_messages = mysql_query ("SELECT * FROM messages");
mysql_close();
$num_messages = mysql_num_rows($get_messages);
if ($num_messages == 0) {
$content = "Сообщений нет.";
$str_seach = array(
"{content}",
"{guest}",
"{author}",
"{id}"
)
$str_replace = array(
"$content",
"",
"",
""
)
$messages = str_replace($str_search, $str_replace, $message_tpl);
}
else {
$messages = '';
while ($row = mysql_fetch_array($get_messages)) {
if ($row["guest"] == "true") {
$guest = 'style="background: #d4d2cb;"';
$who = "аноним";
}
else {
$guest = '';	
$who = "пользователь";
}
$str_search = array(
"{guest}",
"{author}",
"{id}",
"{who}"
);
$str_replace = array(
'$guest',
'$row["author"]',
'$row["id"]',
'$row["who"]'
);
$messages .= str_replace($str_search, $str_replace, $message_tpl);
}
}
Razip ★★
() автор топика
Ответ на: комментарий от drBatty

но если ты думаешь, что {guest} будет волшебным способом меняться на содержимое $guest, то у меня для тебя плохие новости.

А Вы думали что я весь код выкладывал? Конечно я знаю что ничего бы не менялось.

Razip ★★
() автор топика

наверное, перед заменой, нужно каждый раз делать новый массив str_replace_array, и заносить туда текущие значения переменных.

Ну и да, ФМГ, это когда переменным дают имена как у функций. Ты сам себя запутать хочешь?

drBatty ★★
()
Ответ на: комментарий от drBatty

Ух точно. Как то не подумал совсем. :) Сейчас проверю.

Razip ★★
() автор топика
Ответ на: комментарий от drBatty

Если бы ошибка заключалась только лишь в неправильных кавыках, то не нужно было бы выкладывать весь код.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

Если бы ошибка заключалась только лишь в неправильных кавыках, то не нужно было бы выкладывать весь код.

дело не в кавычках, а в том, что ты явно хочешь странного, видимо ты хочешь косвенную переменную, и что-бы str_replace сама её текущее значение в массив вбивала. Т.е. хочешь иметь массив ссылок, которые автоматически разименовываются на лету. Это тебе в C++, а лучше сразу в LISP.

drBatty ★★
()
Ответ на: комментарий от Razip

Если бы ошибка заключалась только лишь в неправильных кавыках, то не нужно было бы выкладывать весь код.

Ты бы все таки написал что ты хочешь получить, ибо есть 3 рабочих варианта, которые можно сделать на основе твоего массива, а телепаты все в отпуске.

Может стоит задуматься о смене профессии и печь осетинские пироги, к примеру? там нет кавычек.

BaBL ★★★★★
()
Ответ на: комментарий от hidden_4003

Правильно в этом случае так:

ну как один из вариантов. Надо только помнить, что массив нужно делать каждый раз по новой. Сам он не сделается.

drBatty ★★
()
Ответ на: комментарий от hidden_4003

Правильно в этом случае так:

в каком случае? человек хочет получить вывод:

static.dynamic.static, а у тебя выводится только dynamic.

BaBL ★★★★★
()
Ответ на: комментарий от BaBL

Ты бы все таки написал что ты хочешь получить, ибо есть 3 рабочих варианта, которые можно сделать на основе твоего массива, а телепаты все в отпуске.

есть четвёртый: аффтор хочет всех запутать. Косвенный пруф: имя массива. Могу посоветовать юзать PCRE с модификатором «e», которые сами себя создают, а потом выполняются.

drBatty ★★
()

Короче. Мне нужно сделать следующее. Менять {id}, {guest} на $row[«id»], $row[«guest»]. Раньше код был таков (примерно):

$message = str_replace('{id}', $row[«id»], $message_tpl); $message = str_replace('{guest}', $row[«guest»], $message);

Теперь решил хранить {id}, {guest} в массиве (то есть те коды что ищем), а также $row[«id»], $row[«guest»] (то, на что заменять найденное).

Вроде бы все работает когда замена происходит лишь один раз:

$str_search = array( «{title}», «{messages}» ); $str_replace = array( «$site_name», «$messages» ); $result = str_replace($str_search, $str_replace, $theme);

Но когда такой код в цикле ничего не работает. Я поудмал что это из-за того что я не правильно записал $row[«id»], $row[«guest»], а видимо не в этом только проблема.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

В PHP новичек, так что ногами не пинать. :)

Razip ★★
() автор топика

В двойных кавычках переменные разымеовываются (вроде так правильно), то есть:

$str = 'Razip';
$text = "username is $str";
echo $text; // username is Razip
$text = 'username is $str';
echo $text; // username is $str
С массивами тоже работает, но не нужно брать в кавычки индекс
$arr = Array('one' => 1, 'two' => 2, 'three' =>3);
$text = "You have $arr[one]";
echo $text; // You have 1
$text = 'You have $arr[one]';
echo $text; // You have $arr[one]
$text = "You have $arr['one']";
echo $text; // что-то странное

alix ★★★★
()
Ответ на: комментарий от Razip
$str_search = array(
"{guest}",
"{author}",
"{id}",
"{who}"
);
$n = $row["id"];
$id = "str_replace_$n";
$$id = array(
"$guest",
"$row[author]",
"$row[id]",
"$row[who]"
);
$messages .= str_replace($str_search, $$id, $message_tpl);

Так не работает. Пожалуйста помогите сделать.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

Тебе уже дали ответ. Во втором массиве не нужны ни кавычки ни $$. Присваивать второй массив нужно в цикле на каждый ряд, но ты так и делаешь.

goingUp ★★★★★
()
Ответ на: комментарий от alix

С массивами тоже работает, но не нужно брать в кавычки индекс

тогда уж лучше так:

$text = "You have ${arr['one']}";

это нотация многих фреймворков, более употребительное выражение.

BaBL ★★★★★
()
Ответ на: комментарий от Razip

Как сделать это? Объясните нубу.

man PCRE для начала осилить разумеется.

drBatty ★★
()
Ответ на: комментарий от BaBL

тогда уж лучше так:

ИМХО правильнее

$text = "You have ". $arr['one'];

drBatty ★★
()
Ответ на: комментарий от BaBL

А разве

echo "some {$arr['index']}";
не лучше?

anonymous
()

Не подумайте что я наглею, не могли бы вы переделать тот код что я выложил так, чтобы он заработал. Ибо я запутался, один советует одно, один другое..

Razip ★★
() автор топика
Ответ на: комментарий от Razip

Ты сперва определись что тебе надо. А лучше не городи велосипедов и используй какой-нибудь движок шаблонов (rain.tpl - он полегче многих)

anonymous
()
Ответ на: комментарий от Razip

вот правильный ответ

http://www.linux.org.ru/forum/web-development/9228564?lastmod=1370349789381#comment-9228623 (комментарий)

то есть вместо

	$str_replace = array(
	  '$guest',
	  '$row["author"]',
	  '$row["id"]',
	  '$row["who"]'
	);
надо писать
	$str_replace = array(
	  $guest,
	  $row["author"],
	  $row["id"]'
	  $row["who"]
	);

koriun
()
Ответ на: комментарий от anonymous

Дак я объяснил что мне нужно. Я хотет чтобы мой скрипт заработал, а именно та часть где массив в цикле (когда не в цикле, работает). Чужой код юзать не буду. А коли кто переделает мой код так, чтобы он работал, я буду рад. Вы не подумайте что я просто поставлю и все, нет, я буду разбираться пока не пойму в чем была ошибка и в чем её решение.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

А ты сам не хочешь разобраться ?

Сделай тест без DB, вместо цикла поставь блок 2 раз с разными данными.

  $message = "";
  $row = array();

  $guest = "guest1";
  $row["author"] = "Author1";
  $row["id"] = "Id1";
  $row["who"] = "who1";

	$str_search = array(
	  "{guest}",
	  "{author}",
	  "{id}",
	  "{who}"
	);
	$str_replace = array(
	  $guest,
	  $row["author"],
	  $row["id"],
	  $row["who"]
	);
	$messages .= str_replace($str_search, $str_replace, $message_tpl);

  $guest = "guest2";
  $row["author"] = "Author2";
  $row["id"] = "Id2";
  $row["who"] = "who";

	$str_search = array(
	  "{guest}",
	  "{author}",
	  "{id}",
	  "{who}"
	);
	$str_replace = array(
	  $guest,
	  $row["author"],
	  $row["id"],
	  $row["who"]
	);
	$messages .= str_replace($str_search, $str_replace, $message_tpl);

 echo $messages;
koriun
()
Ответ на: комментарий от anonymous

Дак я не прощу делать за меня все, хотя бы сделайте то что я выкладывал выше. А именно:

<?php
//* Сообщения *//
$message_tpl = file_get_contents('/var/www/themes/standart/message.tpl');
include ('/var/www/engine/db.php');
$get_messages = mysql_query ("SELECT * FROM messages");
mysql_close();
$num_messages = mysql_num_rows($get_messages);
if ($num_messages == 0) {
$content = "Сообщений нет. о_О";
$str_seach = array(
"{content}",
"{guest}",
"{author}",
"{id}"
)
$str_replace = array(
"$content",
"",
"",
""
)
$messages = str_replace($str_search, $str_replace, $message_tpl);
}
else {
$messages = '';
while ($row = mysql_fetch_array($get_messages)) {
if ($row["guest"] == "true") {
$guest = 'style="background: #d4d2cb;"';
$who = "аноним";
}
else {
$guest = '';	
$who = "пользователь";
}
$str_search = array(
"{guest}",
"{author}",
"{id}",
"{who}"
);
$str_replace = array(
$guest,
$row["author"],
$row["id"],
$row["who"]
);
$messages .= str_replace($str_search, $str_replace, $message_tpl);
}
}
?>
Razip ★★
() автор топика
Ответ на: комментарий от Razip

$str_replace = array( $guest, $row[«author»], $row[«id»], $who );

Только вот так.

Razip ★★
() автор топика
Ответ на: комментарий от goingUp

Вообще ничего нет, обычно так происходит если в коде есть ошибка. Однако, если отключить этот скрипт от главной страницы (туда я подключаю все модули) то все будет работать кроме функционала этого скрипта.

Razip ★★
() автор топика
Ответ на: комментарий от koriun

Вау, спасибо. Оооочеень удобно. Только работающий способ:

php_value display_errors 1
php_value error_reporting 2047

(Это в .htaccess)

Razip ★★
() автор топика
Ответ на: комментарий от Razip

Все починил. о_О Благодарю за эту штуку!!!

Razip ★★
() автор топика
Ответ на: комментарий от anonymous

Да, конечно. Но проглядел что-то, да и по подсветке вроде было все нормально.

Razip ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.