Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не выводит массив в цикле foreach
 
 автор: OLi   (09.01.2012 в 15:53)   письмо автору
 
 

<?
echo '<pre>';
print_r($end_massivev); [b//Здесь выводит массив, а ниже в цикле ничего не выводит.[/b]
echo '</pre>';

$end_massivev select_users();

$k=0;

 foreach (
$end_massivev as $item) {

      
      if (
$item['status']==1) {$status='Открыт';} else {$status='Завершена';}
      
      echo 
' <tr>
    <td>'
.$k.'</td>
    <td>'
.$item['title'][$k].'</td>
    <td>'
.date("d.m.y",$item['start_time']).'</td>
    <td><img width="40" src="'
.$item['img_l'].'"/>'.$item['left'].'</td>
    <td><img width="40" src="'
.$item['img_r'].'"/>'.$item['right'].'</td>
    <td>'
.$item['votes'].'</td>
    <td>'
.$status.'</td>
  </tr>'
;
    

      
    
$k++;  

}


?>

  Ответить  
 
 автор: OLi   (09.01.2012 в 15:55)   письмо автору
 
   для: OLi   (09.01.2012 в 15:53)
 

Если поставить print_r после forech() то уже ничего не выводит.

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 15:57)   письмо автору
 
   для: OLi   (09.01.2012 в 15:53)
 

попробуйте для начала просто вывести $item

<?php
foreach ($end_massivev as $item) { 
 echo 
$item."<br />";
}
?>

откуда берётся массив $end_massivev ?

  Ответить  
 
 автор: OLi   (09.01.2012 в 15:59)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 15:57)
 

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

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 16:02)   письмо автору
 
   для: OLi   (09.01.2012 в 15:59)
 

сделайте так

<?php 
error_reporting
(E_ALL);
foreach(
$end_massivev as $k => $item){
 echo 
$k " - " $item."<br />";
 
// в переменной $item хранится значение индекса $k;
// тогда получается, что надо сравнивать чуть по другому
$status = ($k['status'] == 1) ? "Открыт" "Завершена";
}
?>


p.s. error_reporting(E_ALL); впишите в Ваш код так же как и в моём варианте и посмотрите, будут ошибки/предупреждение или нет.

  Ответить  
 
 автор: OLi   (09.01.2012 в 16:21)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 16:02)
 

Вроде, ошибок нету, возвратило только это:

0 - Array
title - Как быть легантным?

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 17:17)   письмо автору
 
   для: OLi   (09.01.2012 в 16:21)
 

покажите, что возвращает Ваш код.
что возвращает в моём варианте?
откуда массив берёте?
возможно Вам надо сделать вложенный цикл, если $item == Array

  Ответить  
 
 автор: OLi   (09.01.2012 в 17:22)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 17:17)
 

Вот код:

<?
function select_users () {

    
$select_categoty=mysql_query("Select * from `notes` WHERE user='".intval($_COOKIE['id'])."'");
    
    if (
mysql_num_rows($select_categoty)>0){
        
        
       
$row_cat mysql_fetch_row($select_categoty);
            
            
            
         foreach (
$row_cat as $key) {
         
        
        
$select_bitva=mysql_query("select * from `buttles` WHERE id='".$key."'");
        while (
$select_bitva_row mysql_fetch_array($select_bitva)) {
        
    
        
$end_massive['title']=$select_bitva_row['title'];
        
$select_protivniki=mysql_query("select * from `protivniki` WHERE link='".$select_bitva_row['link']."'"); 
        while (
$select_bitva_protivniki mysql_fetch_array($select_protivniki)){
        
$end_massive[]=$select_bitva_protivniki;
         }
         }
         
         
         
         }   
         
        
    } else { echo 
'У  вас нет закладок';}
    
    
    return 
$end_massive;
}



//////////////////////////////////////////////////////////
$end_massivev select_users();

$k=0;

 foreach (
$end_massivev as $item) {

      
      
      
      echo 
'<tr>
    <td>'
.$k.'</td>
    <td>'
.$item['title'][$k].'</td>
    <td>'
.date("d.m.y",$item['start_time']).'</td>
    <td><img width="40" src="'
.$item['img_l'].'"/>'.$item['left'].'</td>
    <td><img width="40" src="'
.$item['img_r'].'"/>'.$item['right'].'</td>
    <td>'
.$item['votes'].'</td>
    <td>'
.$status.'</td>
  </tr>'
;
    

      
    
$k++;  

}
?>


В моем случае ничего не возвращает...В вашем возвращает на страницу следующее:
title - Что круче: Google или Mozilla
0 - Array

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 17:38)   письмо автору
 
   для: OLi   (09.01.2012 в 17:22)
 

правильно, так и будет возвращать потому, что Вы массив упаковали ещё в один массив и применили не нужный foreach()
Вот, у Вас уже есть массив

<?php 
/* в данном случае mysql_fetch_array() возвратил массив, Вам осталось в цикле while() вывести данные
 */
while ($select_bitva_protivniki mysql_fetch_array($select_protivniki)){ 
  
/* вот это лишнее */
 // $end_massive[]=$select_bitva_protivniki; 
 
echo "<pre>";
  
print_r($select_bitva_protivniki);
 echo 
"</pre>";
/* формируйте html вывод здесь */

?>

получается, что foreach лишний

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 17:55)   письмо автору
 
   для: OLi   (09.01.2012 в 17:22)
 

Я тут немного запутался, возможно и Вас ввёл в заблуждение...
Не обратил внимание, что Вы это в функции пытаетесь сделать...
Но и в функции у Вас что то не то...
вот здесь
foreach ($row_cat as $key) {
В запросе Вы пытаетесь из таблицы "notes" получить данные по id пользователя
Что тогда Вы ожидаете в $key?
Скорей всего и этот foreach() тут лишний

  Ответить  
 
 автор: OLi   (09.01.2012 в 18:14)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 17:55)
 

Да, вот теперь я запутался сам..

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 18:13)   письмо автору
 
   для: OLi   (09.01.2012 в 17:22)
 

Вот, немного подправил, но не зная точно, что Вам надо трудно дать правильное решение
<?php
error_reporting
(E_ALL);
function 
select_users () { 
$select_categoty=mysql_query("SELECT * FROM `notes` WHERE user='".intval($_COOKIE['id'])."'");     
    if (
mysql_num_rows($select_categoty)>0){
     while(
$arr_1 mysql_fetch_assoc($select_categoty)){
     
/* посмотрите, что вернул Вам запрос */
     
echo "<pre>";
       
print_r($arr_1)
     echo 
"</pre>";
     
/* и на основании того, что Вам вернул запрос уже составляйте запросы к другим таблицам.
        без foreach()
        а для работы с массивом, который возвращает mysql_fetch_row() удобно использовать конструкцию list()*/     
     
}      
    }
    else{
     echo 
'У  вас нет закладок';
    }    
    return 
$end_massive
}

  Ответить  
 
 автор: OLi   (09.01.2012 в 19:08)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 18:13)
 

Смысл понял, но в ничего не выводит print_r

  Ответить  
 
 автор: OLi   (09.01.2012 в 19:17)   письмо автору
 
   для: OLi   (09.01.2012 в 19:08)
 

Сделал так:
<?
function select_users () {

    
$select_categoty=mysql_query("Select * from `notes` WHERE user='".intval($_COOKIE['id'])."'");
    
    if (
mysql_num_rows($select_categoty)>0){
        
        
       while( 
$row_cat mysql_fetch_row($select_categoty)) {
       
       
                
$select_bitva=mysql_query("select * from `buttles` WHERE id='".$key."'");
        while (
$select_bitva_row mysql_fetch_array($select_bitva)) {
        
    
        
$end_massive['title']=$select_bitva_row['title'];
        
$select_protivniki=mysql_query("select * from `protivniki` WHERE link='".$select_bitva_row['link']."'"); 
        while (
$select_bitva_protivniki mysql_fetch_array($select_protivniki)){
        
$end_massive[]=$select_bitva_protivniki;
         }
         }
            
     
     }        
            
//////////////////
               
        
    
} else { echo 'У  вас нет закладок';}
    
    
    return 
$end_massive;
}

?>



$end_massive = select_users();

print_r($end_massive); // ничего не вывело


Первый запрос возвращает 4 записи

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 19:36)   письмо автору
 
   для: OLi   (09.01.2012 в 19:17)
 

Вот здесь while( $row_cat = mysql_fetch_row($select_categoty)) { удобней будет использовать конструкцию list()
что-то вот так list($first; $second) = mysql_fetxh_row($select_categoty);
А так как Вы делаете, то я бы лучше использовал mysql_fetch_assoc($select_categoty);
и убрал бы цикл while() так как запись для одного конкретного пользователя
Потом во втором бы запросе подставлял в условие WHERE id = '' значение из первого запроса, к чему должно быть приравнено?
вот очередная редакция )))
<?php
error_reporting
(E_ALL);
function 
select_users () { 
    
$select_categoty=mysql_query("Select * from `notes` WHERE user='".intval($_COOKIE['id'])."'"); 
    if (
mysql_num_rows($select_categoty)>0){ 
     
$row_cat mysql_fetch_assoc($select_categoty);
     
/* вот из результата запроса взял какое то значение и подставил в условие WHERE
        например $row_cat['key'] или что там у Вас есть */
        
$select_bitva=mysql_query("select * from `buttles` WHERE id='".$row_cat['key']."'"); 
        while (
$select_bitva_row mysql_fetch_array($select_bitva)) { 
     
/* для третьего запроса в условие WHERE подставил бы значение из второго запроса, то которое требуется
        вот как то так */
         
}       
    }
    else{
     echo 
'У  вас нет закладок';
    } 
    return 
$end_massive

хотя можно объеденить эти запросы в один при помощи JOIN, но это уже другая тема.
Начните с простых пока запросов, потом можно будет объединить...
p.s. конечно же для второго и третьего запроса while() нужен....

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 19:19)   письмо автору
 
   для: OLi   (09.01.2012 в 19:08)
 

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

  Ответить  
 
 автор: OLi   (09.01.2012 в 19:23)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 19:19)
 

Чтобы было понятно, логика запросов такая:
Вывести из таблицы notes все записи для пользователя с id - затем вывести записи из таблицы protivniki где id=id записям от прошлого запроса, и еще с другой таблицы вывести так же где id=id и все это в один упорядоченный для каждой записи массив..

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 19:53)   письмо автору
 
   для: OLi   (09.01.2012 в 19:23)
 

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

  Ответить  
 
 автор: OLi   (09.01.2012 в 20:24)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 19:53)
 

Ну вроде уже понятнее стало, получается что для 2-го запроса, массив $end_massive; наполнять как:
 while ($select_bitva_row = mysql_fetch_array($select_bitva)) {  
     


$end_massive[]=$select_bitva_row['title'];
.....
//По всем полям полям?
     
         }        

  Ответить  
 
 автор: OLi   (09.01.2012 в 20:52)   письмо автору
 
   для: OLi   (09.01.2012 в 20:24)
 

Да вот сложность, должен возвратить 2 записи, а в массив закидывае одну:


Array
(
    [title] => Какой диван круче?
    [end_time] => 1326819200
    [id] => 46
    [img_l] => bitva_images/803_1_jpg
    [img_r] => bitva_images/151_2_jpg
    [left] =>  Диван №1
    [right] =>  Диван №2
    [votes_l] => 12
    [votes_r] => 2
)



function select_users () {  
    $select_categoty=mysql_query("Select * from `notes` WHERE user='".intval($_COOKIE['id'])."'");  
    if (mysql_num_rows($select_categoty)>0){  
     $row_cat = mysql_fetch_assoc($select_categoty); 
    
        $select_bitva=mysql_query("select * from `buttles` WHERE id='".$row_cat['bitva_id']."'");  
        while ($select_bitva_row = mysql_fetch_array($select_bitva)) {  
     


$end_massive['title']=$select_bitva_row['title'];
$end_massive['end_time']=$select_bitva_row['end_time'];


 $select_bitva_p=mysql_query("select * from `protivniki` WHERE link='".$select_bitva_row['link']."'"); 
while ($select_bitva_row_p = mysql_fetch_array($select_bitva_p)) {   
$end_massive['id']=$select_bitva_row_p['id'];
$end_massive['img_l']=$select_bitva_row_p['img_l'];
$end_massive['img_r']=$select_bitva_row_p['img_r'];
$end_massive['left']=$select_bitva_row_p['left'];
$end_massive['right']=$select_bitva_row_p['right'];
$end_massive['votes_l']=$select_bitva_row_p['votes_l'];
$end_massive['votes_r']=$select_bitva_row_p['votes_r'];

}
 
         }        
    } 
    else{ 
     echo 'У  вас нет закладок'; 
    }  
    return $end_massive;  


А на выводе foreach вообще дает 9 записей

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 20:55)   письмо автору
 
   для: OLi   (09.01.2012 в 20:24)
 

вроде да....
только массив $end_massive получается индексным
то есть для обращения к элементам массива надо использовать числовые индексы....
$end_massive[1];
а лучше бы конечно делать ассоциативный массив
получится что то вроде
$end_massive['title']=$select_bitva_row['title'];

ну вот как то так.... вроде ни чего не напутал )))

p.s. Ну а теперь можно попробовать объединить эти запросы в один сложный... если конечно есть желание.
Плюсом будет меньше обращений к базе данных и циклов на выводе результата.

  Ответить  
 
 автор: OLi   (09.01.2012 в 21:01)   письмо автору
 
   для: Slo_Nik   (09.01.2012 в 20:55)
 

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

  Ответить  
 
 автор: Slo_Nik   (09.01.2012 в 21:13)   письмо автору
 
   для: OLi   (09.01.2012 в 21:01)
 

Тогда лучше создать тему в другой ветке форума, специально для MYSQL
Поищите информация по вложенным запросам, объединение таблиц в одном запросе и вот оператор JOIN есть такой

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования