Posted 14 сентября, 201410 yr comment_71347 Добрый вечер, уважаемые, попробую максимально точно обозначить ситуацию и ее проблему. Итак, на моем 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 225Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225Array ( [0] => СынПётра [1] => ДругПётра ) Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225Array ( [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 14 сентября, 201410 yr by lirfaum Link to comment https://ipbmafia.ru/topic/9193-strannosti-foreach-a-da-i-tolko/ Share on other sites Больше вариантов
14 сентября, 201410 yr comment_71348 Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме 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 https://ipbmafia.ru/topic/9193-strannosti-foreach-a-da-i-tolko/?&do=findComment&comment=71348 Share on other sites Больше вариантов
15 сентября, 201410 yr Author comment_71355 Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме 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 https://ipbmafia.ru/topic/9193-strannosti-foreach-a-da-i-tolko/?&do=findComment&comment=71355 Share on other sites Больше вариантов
15 сентября, 201410 yr comment_71376 Правка кода дала уже не 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 https://ipbmafia.ru/topic/9193-strannosti-foreach-a-da-i-tolko/?&do=findComment&comment=71376 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.