Jump to content
View in the app

A better way to browse. Learn more.

IPBMafia.ru - поддержка Invision Community, релизы, темы, плагины и приложения

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

Posted

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

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

 

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

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
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.