PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 05-03-2012 17:32:35

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Ordonner un tableau multidimentionnel avec array multisort

Bonjour,

J'ai créé une petite appli PHP qui me permet de générer un rapport de stock quotidien. Le rapport est fonctionnel, mais si j'applique le array_multisort (actuellement commenté), tout se mélange, et je n'ai plus rien qui ne correspond à plus rien... Savez vous à quoi c'est du?

<?php

header('Refresh: 3000');

require($hostFullPath."required.php");
require($includePath."mailheaders.php");


// VERIFICATION DE LA NECESSITE D'ENVOYER UNE NEWSLETTER DE STOCK
// type=1 -> Journaliere
// type=2 -> Semaine
// type=3 -> Mensuelle

//Array multisort pour les mails : [url]http://php.net/manual/en/function.array-multisort.php[/url]

$sqlDailyNewsletter='SELECT id FROM merp_productstocknewsletters WHERE type=1 AND date>=DATE_ADD(NOW( ),INTERVAL -1 DAY)';
$reqDailyNewsletter = mysql_query($sqlDailyNewsletter) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlDailyNewsletter);
$rowDailyNewsletter = mysql_fetch_array($reqDailyNewsletter);
if ($rowDailyNewsletter['id'])
  $dailyNewsletter="DON'T NEED"; 

if ($magentoDBLinkActive) {

  //Tache de fond à réaliser régulirègement
   
  $sqlEstimates="SELECT
    sales_flat_invoice.entity_id AS invoiceNumber,
    sales_flat_order.entity_id,
    sales_flat_order.increment_id,
    sales_flat_invoice.created_at,
    base_shipping_invoiced,
    tax_invoiced,
    base_total_invoiced_cost,
    total_invoiced,
    sales_flat_order_grid.total_paid,
    billing_name
  FROM
    sales_flat_order,
    sales_flat_order_grid,
    sales_flat_invoice
  WHERE
    sales_flat_order.entity_id=sales_flat_order_grid.entity_id
    AND sales_flat_order.entity_id=sales_flat_invoice.order_id
    AND sales_flat_invoice.entity_id IS NOT NULL
    AND sales_flat_order.entity_id NOT IN (SELECT estimateId FROM merp_invoices WHERE orderFrom=2)
    AND sales_flat_invoice.created_at>'2010'
  ORDER BY sales_flat_invoice.entity_id ASC"
;

  $sqlMagentoInvoices=$sqlEstimates;
  $reqMagentoInvoices = mysql_query($sqlMagentoInvoices) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlMagentoInvoices);
  while ($rowMagentoInvoices = mysql_fetch_array($reqMagentoInvoices)) {

    /*
    // Pour rattraper les ventes de 2010
    if (substr($rowMagentoInvoices[created_at],0,4)==2010)
      $rowMagentoInvoices[created_at]="2010-12-31";
    */

    // de payment_method à payment_identification il manque les informations à trouver dans la bdd magento
    if ($rowMagentoInvoices[total_paid]!=0.000)
      mysql_query('INSERT INTO merp_payment VALUES ("","'.$rowMagentoInvoices[created_at].'","'.$rowMagentoInvoices[entity_id].'","","'.$_SESSION['userId'].'","'.$magentoDefaultPaymentMethod.'",'.$magentoDefaultPaymentBank.',"'.$rowMagentoInvoices[billing_name].'","FACTURE : '.$rowMagentoInvoices[invoiceNumber].'","'.$rowMagentoInvoices[total_paid].'","2",0)');


    if ($rowMagentoInvoices[total_invoiced]==$rowMagentoInvoices[total_paid])
      $accountancyBalanced=1;
    else
      $accountancyBalanced=0;
     
    mysql_query('INSERT INTO merp_invoices VALUES ("","'.$today.'","'.$rowMagentoInvoices[entity_id].'","'.$_SESSION['userId'].'",2,"'.$accountancyBalanced.'","")');

  }


  // DEDUCTION DU STOCK MAGENTO DANS L'HISTORIQUE DE MERP

  $sqlForThisProduct='SELECT DISTINCT entity_id AS productId, value AS reference, qty AS stock FROM catalog_product_entity_varchar, cataloginventory_stock_item WHERE attribute_id='.$productNameAttributeId.' AND product_id=entity_id ORDER BY entity_id DESC, qty ASC, product_id DESC';
  $reqForThisProduct = mysql_query($sqlForThisProduct) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProduct);
  while ($rowForThisProduct = mysql_fetch_array($reqForThisProduct)) {
    $sqlForThisProductHistory="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' ORDER BY date DESC, id DESC";
    $reqForThisProductHistory = mysql_query($sqlForThisProductHistory) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistory);
    $rowForThisProductHistory = mysql_fetch_array($reqForThisProductHistory);
   
    if ($rowForThisProduct['stock']!=$rowForThisProductHistory['stockNumber'])
      mysql_query('INSERT INTO merp_productstockshistory VALUES ("","'.$today.'",2,'.$rowForThisProduct['productId'].',"0","","2",'.$rowForThisProduct['stock'].')');

    if (empty($dailyNewsletter)) {
      $magentoProductReference[$rowForThisProduct['productId']]=$rowForThisProduct['reference'];
      $magentoProductStock[$rowForThisProduct['productId']]=$rowForThisProduct['stock'];
   
      $sqlForThisProductHistoryDaily="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -1 DAY) ORDER BY date DESC, id DESC";
      $reqForThisProductHistoryDaily = mysql_query($sqlForThisProductHistoryDaily) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryDaily);
      $rowForThisProductHistoryDaily = mysql_fetch_array($reqForThisProductHistoryDaily);
      $magentoProductSelledThisDay[$rowForThisProduct['productId']]=$rowForThisProductHistoryDaily['stockNumber']-$rowForThisProduct['stock'];
     
      //
      if ($magentoProductSelledThisDay[$rowForThisProduct['productId']]>0)
        $magentoDailyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$magentoProductSelledThisDay[$rowForThisProduct['productId']]),2);

      $sqlForThisProductHistoryWeekly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -7 DAY) ORDER BY date DESC, id DESC";
      $reqForThisProductHistoryWeekly = mysql_query($sqlForThisProductHistoryWeekly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryWeekly);
      $rowForThisProductHistoryWeekly = mysql_fetch_array($reqForThisProductHistoryWeekly);
      $magentoProductSelledThisWeek[$rowForThisProduct['productId']]=$rowForThisProductHistoryWeekly['stockNumber']-$rowForThisProduct['stock'];
     
      if ($magentoProductSelledThisWeek[$rowForThisProduct['productId']]>0)
        $magentoWeeklyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$magentoProductSelledThisWeek[$rowForThisProduct['productId']]),2);

      $sqlForThisProductHistoryMonthly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -30 DAY) ORDER BY date DESC, id DESC";
      $reqForThisProductHistoryMonthly = mysql_query($sqlForThisProductHistoryMonthly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryMonthly);
      $rowForThisProductHistoryMonthly = mysql_fetch_array($reqForThisProductHistoryMonthly);
      $magentoProductSelledThisMonth[$rowForThisProduct['productId']]=$rowForThisProductHistoryMonthly['stockNumber']-$rowForThisProduct['stock'];
     
      // Plus nécessaire de calculer, car on utilise l'autonomie moyenne jour + semaine / 2
      //if ($magentoProductSelledThisMonth[$rowForThisProduct['productId']]>0)
      //  $magentoMonthlyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$magentoProductSelledThisMonth[$rowForThisProduct['productId']]),2);

      $magentoStockAutonomy[$rowForThisProduct['productId']]=round((($magentoDailyStockAutonomy[$rowForThisProduct['productId']]+$magentoWeeklyStockAutonomy[$rowForThisProduct['productId']])/2),1);
    }
  }
}

// Compilation du tableau pour els articles de la base ERP
if (empty($dailyNewsletter)) {
  $sqlForThisProduct='SELECT DISTINCT merp_products.id AS productId, reference, stock FROM merp_products, merp_productstockshistory WHERE merp_products.id=merp_productstockshistory.productId AND productType=1 AND (date<=DATE_ADD(NOW( ),INTERVAL -30 DAY) OR stock>=1) ORDER BY stock ASC, reference ASC, date DESC LIMIT 500';
  $reqForThisProduct = mysql_query($sqlForThisProduct) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProduct);
  while ($rowForThisProduct = mysql_fetch_array($reqForThisProduct)) {
    $sqlForThisProductHistory="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='1' ORDER BY date DESC, id DESC";
    $reqForThisProductHistory = mysql_query($sqlForThisProductHistory) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistory);
    $rowForThisProductHistory = mysql_fetch_array($reqForThisProductHistory);
   
    $merpProductReference[$rowForThisProduct['productId']]=$rowForThisProduct['reference'];
    $merpProductStock[$rowForThisProduct['productId']]=$rowForThisProduct['stock'];
   
    $sqlForThisProductHistoryDaily="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -1 DAY) ORDER BY date DESC, id DESC";
    $reqForThisProductHistoryDaily = mysql_query($sqlForThisProductHistoryDaily) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryDaily);
    $rowForThisProductHistoryDaily = mysql_fetch_array($reqForThisProductHistoryDaily);
    $merpProductSelledThisDay[$rowForThisProduct['productId']]=$rowForThisProductHistoryDaily['stockNumber']-$rowForThisProduct['stock'];
   
    if ($merpProductSelledThisDay[$rowForThisProduct['productId']]>0)
      $merpDailyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$merpProductSelledThisDay[$rowForThisProduct['productId']]),2);

    $sqlForThisProductHistoryWeekly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -7 DAY) ORDER BY date DESC, id DESC";
    $reqForThisProductHistoryWeekly = mysql_query($sqlForThisProductHistoryWeekly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryWeekly);
    $rowForThisProductHistoryWeekly = mysql_fetch_array($reqForThisProductHistoryWeekly);
    $merpProductSelledThisWeek[$rowForThisProduct['productId']]=$rowForThisProductHistoryWeekly['stockNumber']-$rowForThisProduct['stock'];
   
    if ($merpProductSelledThisWeek[$rowForThisProduct['productId']]>0)
      $merpWeeklyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$merpProductSelledThisWeek[$rowForThisProduct['productId']]),2);

    $sqlForThisProductHistoryMonthly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -30 DAY) ORDER BY date DESC, id DESC";
    $reqForThisProductHistoryMonthly = mysql_query($sqlForThisProductHistoryMonthly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryMonthly);
    $rowForThisProductHistoryMonthly = mysql_fetch_array($reqForThisProductHistoryMonthly);
    $merpProductSelledThisMonth[$rowForThisProduct['productId']]=$rowForThisProductHistoryMonthly['stockNumber']-$rowForThisProduct['stock'];
    if ($merpProductSelledThisMonth[$rowForThisProduct['productId']]>0)
      $merpMonthlyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$merpProductSelledThisMonth[$rowForThisProduct['productId']]),2);

    $merpStockAutonomy[$rowForThisProduct['productId']]=round((($merpDailyStockAutonomy[$rowForThisProduct['productId']]+$merpWeeklyStockAutonomy[$rowForThisProduct['productId']]+$merpDailyStockAutonomy[$rowForThisProduct['productId']])/3),1);
  }
 
  //array_multisort($magentoProductSelledThisWeek, SORT_DESC, $magentoStockAutonomy, SORT_ASC, $magentoProductStock, SORT_DESC, $magentoProductReference, SORT_ASC, $magentoProductReference);
  foreach($magentoProductReference as $key => $value) {
    if ($magentoProductSelledThisMonth[$key]!=0 && $magentoProductSelledThisWeek[$key]!=0 && $magentoProductSelledThisDay[$key]!=0)
      $magentoProductChangeForDailyNewsletter .= '<tr><td>'.$value.' ('.$key.')</td><td>'.$magentoProductSelledThisMonth[$key].'</td><td>'.$magentoProductSelledThisWeek[$key].'</td><td>'.$magentoProductSelledThisDay[$key].'</td><td>'.$magentoStockAutonomy[$key].'</td><td>'.$magentoProductStock[$key].'</td></tr>';
  }

  //array_multisort($merpProductSelledThisWeek, SORT_DESC, $merpStockAutonomy, SORT_ASC, $merpProductStock, SORT_DESC, $merpProductReference, SORT_ASC, $merpProductReference);
  foreach($merpProductReference as $key => $value) {
    if ($merpProductSelledThisMonth[$key]!=0 && $merpProductSelledThisWeek[$key]!=0 && $merpProductSelledThisDay[$key]!=0)
      $merpProductChangeForDailyNewsletter .= '<tr><td>'.$value.' ('.$key.')</td><td>'.$merpProductSelledThisMonth[$key].'</td><td>'.$merpProductSelledThisWeek[$key].'</td><td>'.$merpProductSelledThisDay[$key].'</td><td>'.$merpStockAutonomy[$key].'</td><td>'.$merpProductStock[$key].'</td></tr>';
  }

  $tabHeader ='<table><tr><td><b>Reference (id)</b></td><td><b>Vendu(s) (m)</b></td><td><b>Vendu(s) (7j)</b></td><td><b>Vendu(s) (j)</b></td><td><b>Autonomie</b></td><td><b>En Stock</b></td>';
  $tabFooter ='</table><br /><br />';
  $messageSubject="Rapport journalier de sortie de stock";
  $message ="Bonjour<br>";
  $message .="-------------------------------------------- <br><br>";
  $message .="Ce message vous informe des produits vendus depuis hier<br /><br />";
  $message .="BASE Magento".$tabHeader.$magentoProductChangeForDailyNewsletter.$tabFooter;
  $message .="BASE ERP".$tabHeader.$merpProductChangeForDailyNewsletter.$tabFooter;
  $message .="</table><br /><br /><b>Cordialement, l'équipe $ASociete</b>";
 
  $messageReadyToSend=$message_header_start.$message.$message_header_end;

  mail($mailBuyerManager, $messageSubject, $messageReadyToSend, $mailheaders);
  mysql_query('INSERT INTO merp_productstocknewsletters VALUES ("","'.$today.'","1","'.$mailBuyerManager.'")');
}

mysql_close();

echo 'SYNCHRO EFFECTUÉE';

?>

Dernière modification par rick's (06-03-2012 14:39:43)

Hors ligne

#2 06-03-2012 08:06:01

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Ordonner un tableau multidimentionnel avec array multisort

Bonjour,

Déjà il existe un wall pour poster ce genre de message, de deux, je ne fais pas de POO pour faire du relationnel, et deux trois, la réponse à ta question se trouve peut être dans la doc de php.

Enfin je dis cela, j'ai rien dit^^.

Jc

PS: Rien que l'idée du temps que doit mettre cette procédure, sans parler des ressources sollicitées (duplications mémoire avec les foreach, etc..., etc..), cela me fait froid dans le dos! brrrr!

Dernière modification par Jc (06-03-2012 08:12:19)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 06-03-2012 14:34:42

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Re : Ordonner un tableau multidimentionnel avec array multisort

Merci JC pour ce commentaire... Je devrais peut être simplifier le code pour une plus grande lisibilité. La procédure dure bien 3 minutes, mais s’exécute de nuit, donc notre serveur est plutôt libre à ce moment là...

Je sais bien qu'il y'a une doc pour cette fonction, je pensai l'utiliser correctement (avec ce que j'ai compris de la doc) mais apparement non.

Si je fais appel au forum c'est pour une aide et non un constat...

Ci-dessous, un morceau de code pour comprendre un peu plus comment je charge mes valeurs


<?php

$produit[1][grossiste]="Electrozonic";
$produit[1][reference]="puce mémoire nand";
$produit[1][venduesous1j]=2;
$produit[1][venduesous7j]=6;
$produit[1][venduesous31j]=18;

$produit[2][grossiste]="Electrozonic";
$produit[2][reference]="puce mémoire nor";
$produit[2][venduesous1j]=1;
$produit[2][venduesous7j]=3;
$produit[2][venduesous31j]=4;

$produit[4][grossiste]="ABzonic";
$produit[4][reference]="puce mémoire flash";
$produit[4][venduesous1j]=25;
$produit[4][venduesous7j]=57;
$produit[4][venduesous31j]=120;


?>
 

Comment je peux utilsier array_multisort ou une autre fonction afin d'obtenir un classement d'abord par grossiste, et ensuite par ventesous7j et ensuite ventesous1j ?

J'espère que c'est un peu plus compréhensible maintenant...

Hors ligne

#4 07-03-2012 21:02:50

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Ordonner un tableau multidimentionnel avec array multisort

Bonjour,

J'avais parfaitement compris votre problème, mais visiblement c'est vous qui n'avez pas bien saisi ma réponse. Je vais cependant vous éclairer un peu plus sur le array_multisort() à la fin de ce post.

Je sais très bien que la mode est au développement orienté objet à outrance et à l'utilisation exclusive ou presque des bases de données pour ne gérer QUE la persistence des données, et votre cas en est un cas très représentatif. Si vous trouvez normal d'éxécuter une procédure PHP pour faire du relationnel, domaine de prédilection des bases de données, moi pas du tout, et je me bats contre cela tous les jours ou presque. J'utilise de fait, chaque technologie pour ce dont elle a été conçue et optimisée, et vous devriez penser à en faire autant. Il faut que vous sachiez que votre procédure PHP peut être faite de jour quand vous le souhaitez à partir d'une requête base de données (voire exceptionnellement deux). Que va-t-il se passer pour vous lorsque vous allez devoir passer de véritables processus de nuit sur lesquels vous n'aurez pas le choix quand à la méthode et à la technologie à utiliser, face à une procédure telle que la vôtre actuellement? Vous ne pourrez plus la passer que de jour, et les problèmes sérieux vont alors commencer pour vous, et il sera peut être trop tard pour limiter la casse à ce moment.

Mais pour faire cela, il faut une architecture base de données solide, chose que vous n'avez surement pas vu votre code PHP. Je dirais même plus que votre code PHP est à l'image de ce qu'est votre BD, c'est à dire je vous laisse deviner hmm.
Donc on va continuer dans le n'importe quoi et je vais essayer de vous éclairer sur votre problème PHP.

Le array_multisort, peut trier indépendamment chacune des colonnes de son tableau indépendamment les unes des autres. Pour cela, la condition nécessaire est que chacune de ses colonnes soit elle-même représentée par un tableau, auquel cas le tri serait impossible à réaliser. Pour arriver à vos fins, la solution est donc évidente. Il faut créer un tableau indépendant pour chaque colonne de votre tableau produits, que vous passez ensuite pour chacun d'entre eux dans votre array_multisort() pour avoir le résultat attendu. Il faut donc passer d'un tableau de lignes (ici $produit) en tableaux de colonnes. Pour ce faire vous pouvez utilisez la méthode présentée dans le manuel PHP de la fonction avec des foreach, ce qui n'est pas évident à la base lorsque l'on ne maîtrise pas les foreach. Comme je vous l'avais fait justement remarqué, la méthode est gourmande en ressources mémoire, car il faut transformer les lignes en colonnes, et sur un grand nombre de lignes, c'est pas toujours évident surtout si vous êtes de plus sur un serveur mutualisé.

Pour finir, je me permets d'insister, jusqu'à preuve du contraire, on ne fait pas du datamining en php, et la vocation de php n'a jamais été celle-ci : il n'est tout simplement pas conçu pour.

Bien cordialement,

Jc.

Dernière modification par Jc (07-03-2012 23:31:53)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 09-03-2012 08:40:52

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Ordonner un tableau multidimentionnel avec array multisort

Bonjour,

Juste pour info, choisir un CMS n'est jamais très bon pour préserver l'état de santé de ses données d'entreprise dans le temps, et même tout court, et vous être en quelque sorte prisonnier de votre choix. Zend n'est pas non plus le meilleur des choix dans la médiocrité des CMS sur ce point, et ce, même avec Doctrine d'intégré (de tout de manière, sans Doctrine ce n'est même pas la peine..). Rare sont les CMS qui vous ne ferment pas les portes complètement ou presque pour une gestion de base de données digne de ce nom.

Cordialement,

Jc.

Dernière modification par Jc (09-03-2012 08:42:27)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums