Перейти к содержанию

Странности foreach-а да и только


lirfaum

Рекомендуемые сообщения

Добрый вечер, уважаемые, попробую максимально точно обозначить ситуацию и ее проблему. Итак, на моем ipb стоит расширение Refferals System, которое нужно немного расширить, а если быть точным, то в таблицу, где выводятся реффералы пользователя нужно вывести и реффералов моих реффералов и их реффералов и так до определенной глубины вложенности. Переходим от слов к коду:

<foreach loop="MyInvitedMembersLoop:$invited as $user">
    <php>
        $this->DB->build(array('select' => 'name', 'from'   => 'members', 'where'  => 'dp3_rs_referred_by = '.$user['i_invited_id']));
        $this->DB->execute();

        while($row = $this->DB->fetch())
        {
            $chlds[] = $row['name'];
        }
        print_r($chlds);
    </php>

/*и так далее*/

Суть данного куска в том, что идет перебор тех самых реффералов. Потому как только стартует "родной" foreach плагина я начинаю искать по таблица дочерних реффералов моего рефферала (пока что стоит добиться результата на уровне вложенности 2, а там дело возьмет рекурсия и иже с ней). Итогом выполнения будет array $chlds. Консоль благополучно выдает нам значения этого array-я:

Array
(
    [0] => СынПётра
    [1] => ДругПётра
)

Но так как мы имеем дело с ipb, то не может быть речи о том, чтобы вывести нужные нам данные в foreach-у php вставки,- необходимо использовать тег <foreach> и вот как выглядит кусок вместе с ним:

<foreach loop="MyInvitedMembersLoop:$invited as $user">
    <php>
        $this->DB->build(array('select' => 'name', 'from'   => 'members', 'where'  => 'dp3_rs_referred_by = '.$user['i_invited_id']));
        $this->DB->execute();

        while($row = $this->DB->fetch())
        {
            $chlds[] = $row['name'];
        }
        print_r($chlds);
    </php>

    <if test = "is_array($chlds)">
        <foreach loop="$chlds as $chld">
            <p>*{$chld}</p>
        </foreach>
    <else />
        <p>null</p>
    </if>

Итог - 4 null в месте вывода (по одному на рефферала) и плевки в журнал ошибок:

 

Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225

Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225
Array ( [0] => СынПётра [1] => ДругПётра ) 
Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225
Array ( [0] => СынПётра [1] => ДругПётра ) 
Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225

 

Из чего следуют 2 весьма бугуртные для меня вещи:

    1. Где же я допустил ошибку в написании этого "форича" злосчастного;

    2. Как так $chlds вообще не считается массивом (этот вывод основан на выводе <p>null</p> на страницу)?

 

В 225 строке кэш файла как раз тот самый foreach, транслированный на php лад:

$_ips___x_retval = '';
$__iteratorCount = 0;
foreach( $chlds as $chld )
{

	$__iteratorCount++;
	$_ips___x_retval .= "
        <p>*{$chld}</p>                                
";

/*и так далее*/

Маленькая добавка, если выводить содержимое этого же array-я в <php> аналогичным кодом, то все прекрасно выводится.

На коленях стою...

Изменено пользователем lirfaum
Ссылка на комментарий
Поделиться на другие сайты

Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме iPB, хотя там пару вопросов всего было на эту тему (что странно), пришлось поискать.
Решение:



<foreach loop="MyInvitedMembersLoop:$invited as $user">
    <php>
	$chlds = array();
        $this->DB->build(array('select' => 'name', 'from'   => 'members', 'where'  => 'dp3_rs_referred_by = '.$user['i_invited_id']));
        $this->DB->execute();

        while($row = $this->DB->fetch())
        {
            $chlds[] = $row['name'];
        }
	$this->$chlds = $chlds;
    </php>

    <if test = "is_array($this->$chlds)">
        <foreach loop="$this->$chlds as $chld">
            <p>*{$chld}</p>
        </foreach>
    <else />
        <p>null</p>
    </if>
Ссылка на комментарий
Поделиться на другие сайты

 

Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме iPB, хотя там пару вопросов всего было на эту тему (что странно), пришлось поискать.

Решение:



<foreach loop="MyInvitedMembersLoop:$invited as $user">
    <php>
	$chlds = array();
        $this->DB->build(array('select' => 'name', 'from'   => 'members', 'where'  => 'dp3_rs_referred_by = '.$user['i_invited_id']));
        $this->DB->execute();

        while($row = $this->DB->fetch())
        {
            $chlds[] = $row['name'];
        }
	$this->$chlds = $chlds;
    </php>

    <if test = "is_array($this->$chlds)">
        <foreach loop="$this->$chlds as $chld">
            <p>*{$chld}</p>
        </foreach>
    <else />
        <p>null</p>
    </if>

Хотел было я уже возрадоваться, но не тут то было. Правка кода дала уже не warning, а полноценный error черным шрифтом на белой странице:

 

Catchable fatal error: Object of class skin_referrals_1 could not be converted to string in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 259

Ссылается данная ошибка на данную строку:

<if test = "is_array($this->$chlds)">

Не люблю дабл-постинг, но тем не менее. Я вывел нужную мне информацию немного другим путем (вывешиваю на случай, если у кого то будет схожая проблема и такое решение ему вполне угодит):

<php>
	$chlds = array();
	$pr_tbl = '';
	$this->DB->build(array('select' => 'name', 'from'   => 'members', 'where'  => 'dp3_rs_referred_by = '.$user['i_invited_id']));
	$this->DB->execute();

	while($row = $this->DB->fetch())
	{
		$chlds[] = $row['name'];
	}
	
	$pr_tbl .= "<p>".$user['name']."</p>";
	
	if (!empty($chlds))
	{
		$pr_tbl .= "<p>Дочерние рефералы:</p>";
		foreach($chlds as $chld)
		{
			$pr_tbl .= "<p>*".$chld."</p>";
		}
	}
	else
		$pr_tbl .= "<p>Дочерние рефералы отсутствуют</p>";
</php>
{$pr_tbl}

Но тем не менее, факт непонимания проблемы в попытке реализовать это предыдущим способом не убирает, посему тему прошу не закрывать, ведь с foreach-ем нужно будет столкнуться еще не раз и не два=)

Ссылка на комментарий
Поделиться на другие сайты

Правка кода дала уже не warning, а полноценный error черным шрифтом на белой странице:

Хм. У меня вот этот код на сайте работает без errorов 

			<php>
				$cities=array();
				if($this->request['city']){
					$cities = $this->request['city'];
				}else{
					foreach($data['records'] as $v){
					$cities[] = $v['ads_city'];}
				}
				$cities = array_unique($cities);
				$this->cities = $cities;
			</php>

		<if test="is_array($this->cities)">
			<foreach loop="$this->cities as $city">
				{$city}
			</foreach>
		</if>
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...