Jump to content

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


Recommended Posts

Добрый вечер, уважаемые, попробую максимально точно обозначить ситуацию и ее проблему. Итак, на моем 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> аналогичным кодом, то все прекрасно выводится.

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

Edited by lirfaum
Link to comment
Share on other sites

Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме 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>
Link to comment
Share on other sites

 

Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме 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-ем нужно будет столкнуться еще не раз и не два=)

Link to comment
Share on other sites

Правка кода дала уже не 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>
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

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

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...