Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    ciclo array multidimensionale

    Problema:

    All'interno di una classe ho questa parte di codice, tralasciate la parte html che è semplicemente di prova per vedere l'output....

    codice:
            while ($row = mysql_fetch_array($records)) {
    
                $this->prodotto = "<tr><td>".$row['CODICE']."</td><td>".$row['DESFAMIGLIA']."</td><td>".$row['DESCRIZION']."</td><td style=\"text-align:right;\">".number_format($row['PREZZO'], 2, ',', '.')."</td><td style=\"text-align:center;\">1</td><td style=\"text-align:center;\">1</td>\n";
    
                foreach($items_pdv as $item) {
           
                    $this->sellout_find="";
    
                    for($i=0; $i!=$item['numero_date']; $i++){
                        
                        $cerca_sellout = open_db_core("
                                                       SELECT
                                                       sellout.codice_prodotto,
                                                       sellout.quantita,
                                                       sellout.prezzo_unitario
    
                                                       FROM sellout
    
                                                       WHERE sellout.data_sottoevento='".$item['data_'.$i]."'
    
                                                       AND sellout.codice_prodotto='".$row['CODICE']."'
                                                      ");
    
                        $result_sellout = mysql_fetch_array($cerca_sellout);
    
                        if(mysql_num_rows($cerca_sellout)==0){
    
                            $this->sellout_find.= "<td style=\"text-align:center;\">0</td><td style=\"text-align:right;\">0,00</td>\n";
    
                        }else{
    
                            $this->sellout_find .= "<td style=\"text-align:center;\">".$result_sellout['quantita']."</td><td style=\"text-align:right;\">".number_format(($result_sellout['prezzo_unitario']*$result_sellout['quantita']),2, ',', '.')."</td>\n";
    
                        }
    
                    }
                            
                            
                    $this->righe[] = ($item['id_pdv']!=$this->ultimo_pdv) ? $this->prodotto.$this->sellout_find : $this->prodotto.$this->sellout_find."</tr>\n";
    
                }
                
            }
    l'array multidimensionale è del tipo:

    codice:
    Array ( [0] => Array ( [id_pdv] => 45 [nome_pdv] => Sephora Lucca [numero_date] => 2 [data_0] => 2010-02-03 [data_1] => 2010-02-11 ) [1] => Array ( [id_pdv] => 50 [nome_pdv] => Sephora Milano - Via Dante [numero_date] => 1 [data_0] => 2010-06-17 [data_1] => 2010-02-11 ) )
    il problema è ch all'interno del while c'è il foreach e questo esegue le sue operazioni senza problemi, semplicemente, attende il ciclo while sucessivo prima di prendere in considerazione il secondo valore dell'array $items_pdv (ciclata nel foreach), mentre a me servirebbe che scorresse tutta l'array ad ogni ciclo while e non un indice ad ogni ciclo.....spero di essermi spiegato.

    Grazie
    SK

  2. #2
    Dal codice postato non si capisce poco cosa vuoi fare e cosa non funziona.

    Ad occhio e croce direi che quella query SELECT messa nel ciclo strapazza il database in modo pazzesco
    quando si poteva usare una JOIN (così eviti quel while dove ottieni $row['CODICE']) e usare la clausola WHERE IN (ed evitare il ciclo for dove ottieni $item['data_'.$i]).
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  3. #3
    Intanto grazie della risposta.

    Mi spiego un po' meglio, allora, item['data_'.$i] mi seve per recuperare le date dentro l'array e fare il controllo, la query li dentro non è il massimo, ma come dicevo sto facendo delle prove, quindi se hai consigli sono come sempre ben accetti.

    Il concetto è questo: devo costruirmi una tabella in base a dei dati che vengono passati alla classe.
    In base ad alcuni parametri, devo prendere in considerazione i prodotti di un cliente piuttosto che quelli di un altro, e fin qui nessun problema. Dopo di che, anche per quetioni di formattazione logica della tabella, devo eseguire un controllo su ogni prodotto e vedere se è stato venduto, ciclando l'array multidimensionale che contiene il nome del punto vendita e le date coinvolte, quindi se in una delle date in quel punto vendita, quel determinato prodotto è stato venduto, lo segno inserendo la quantità e il costo nella tabella nella rispettiva colonna e così per ogni prodotto e ogni punto vendita per ognuna delle date.
    Nel caso specifico, l'operazione funziona, ma il ciclo foreach (e sarà sicuramente una cavolata mia), cicla le date del primo punto vendita, mentre il secondo lo considera nel secondo cilco while, mentre dovrebbe ciclare tutta l'array ad ogni ciclo.

  4. #4
    onestamente mi perdo nel tuo contorto ragionamento.

    Per farti capire devi:
    - postare la struttura delle tabelle coinvolte: sellout e quella con il campo codice
    - postare la struttura dell'array $items_pdv
    - spiegare cosa vuoi estrarre
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  5. #5
    Allora, struttura tabella sellout

    [codice]
    CREATE TABLE IF NOT EXISTS `sellout` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `id_sottoevento_personale` int(11) NOT NULL,
    `id_personale` int(11) NOT NULL,
    `data_sottoevento` date NOT NULL,
    `codice_prodotto` varchar(255) NOT NULL,
    `quantita` int(11) NOT NULL,
    `prezzo_unitario` decimal(10,2) NOT NULL,
    `marchio` varchar(255) NOT NULL,
    `famiglia` varchar(255) NOT NULL,
    `tipo` varchar(2) NOT NULL DEFAULT 'p',
    `data` date NOT NULL,
    `conferma` int(1) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=25 ;
    [/code]

    quella di prodotti, che è così, perchè importata e aggiornata ogni tot. deve perforza essere così:

    codice:
    CREATE TABLE IF NOT EXISTS `prodotti` (
      `CODICE` text,
      `DESCRIZION` text,
      `PREZZO` decimal(10,2) DEFAULT NULL,
      `UNITAMIVEN` text,
      `GRUPPOMERCE` text,
      `DESGRUPPOMERCE` text,
      `FAMIGLIA` text,
      `DESFAMIGLIA` text,
      `DESMARCHIO` text,
      `DESLINEA` text,
      FULLTEXT KEY `DESMARCHIO` (`DESMARCHIO`),
      FULLTEXT KEY `DESGRUPPOMERCE` (`DESGRUPPOMERCE`),
      FULLTEXT KEY `DESCRIZION` (`DESCRIZION`),
      FULLTEXT KEY `DESFAMIGLIA` (`DESFAMIGLIA`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    L'array cera gia sopra ma lo riporto:

    codice:
    Array ( [0] => Array ( [id_pdv] => 45 [nome_pdv] => Sephora Lucca [numero_date] => 2 [data_0] => 2010-02-03 [data_1] => 2010-02-11 ) [1] => Array ( [id_pdv] => 50 [nome_pdv] => Sephora Milano - Via Dante [numero_date] => 1 [data_0] => 2010-06-17 [data_1] => 2010-02-11 ) )
    Quello che devo fare è:

    Prendo dalla tabella prodotti, solo i prodotti di un determinato cliente, in base a dati passati alla classe, prendere dalla tabella sellout solo le date comprese da un range passato alla classe e controllare per ogni data quali prodotti sono stati venduti in quantità e prezzo e il tutto deve essere messo in una tabella(html) e mostrata a video.

    Nell'array c'è il nome del punto vendita, il suo id, il numero di date svolte in quel punto vendita e le date, il controllo va fatto su ogni data di tutti i punti vendita su ogni prodotto estratto nella query che estrae solo i prodotti del determinato cliente.

  6. #6
    Comunque il problema fondamentale è nel ciclo while che ho postato prima, mi aspettavo che ad ogni ciclo il foreach ciclasse tutta l'array, invece no, e a me serve che dentro al ciclo while il foreach cicli tutti i punti vendita e le sue date cercando se quel prodotto c'è o meno e così via.

  7. #7
    allora

    codice:
    foreach($items_pdv as $item)
    scorre tutte le chiavi di primo livello dell'array $items_pdv... quindi si cicla tutto il primo livello... se ti serve di guardare a sotto livelli, devi mettere altri cicli annidati
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    ciao santino...

    io non mi raccapezzo in questo codice...
    però una cosa mi sembra palese... all'interno del
    codice:
    while ($row = mysql_fetch_array($records))
    esegue questa query
    [code]SELECT
    sellout.codice_prodotto,
    sellout.quantita,
    sellout.prezzo_unitario

    FROM sellout

    WHERE sellout.data_sottoevento='".$item['data_'.$i]."'

    AND sellout.codice_prodotto='".$row['CODICE']."'[code]

    Non sarebbe più esatto fare:
    codice:
    SELECT 
    	sellout.codice_prodotto,
    	sellout.quantita,
    	sellout.prezzo_unitario
    FROM 
    	sellout
    INNER JOIN
    	prodotti ON sellout.codice_prodotto=prodotti.CODICE
    WHERE ETC ETC
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  9. #9
    oly non ti seguo... il post parla di ciclare un array non di query... visto che la query annidata non incide nel ciclo non la leggo neanche...
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  10. #10
    Originariamente inviato da oly1982
    Non sarebbe più esatto fare:
    codice:
    SELECT 
    	sellout.codice_prodotto,
    	sellout.quantita,
    	sellout.prezzo_unitario
    FROM 
    	sellout
    INNER JOIN
    	prodotti ON sellout.codice_prodotto=prodotti.CODICE
    WHERE ETC ETC
    Ma facendo così estraggo solo quello che trovo nella tabella sellout, mentre io devo tirare fuori tutti i prodotti del tal cliente e "segnare" quelli venduti con la loro quantità e prezzo, o mi sbaglio?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.