首页 > 解决方案 > 有没有办法在不引用 PHP 的情况下复制数组?

问题描述

我有一个名为“Dim”的对象,其中包含一些属性和一个公共多维数组“tab_dim”。

主要问题
当我想复制多维数组 $dim->tab_dim 时,它似乎复制了对它的引用,我真的不知道为什么。

我尝试了一些解决方案,例如使用“__clone”方法克隆 $dim 对象或使用 array_merge 等函数复制数组......但它从未正确地将数组复制到 $save_tab_dim。

Main
我的主程序很大,所以我稍微总结了一下。

try {
  $dim = new Dim($date_deb, $date_fin, $heureDebGroupe, $heureFinGroupe - 1, $groupe,$activite);
} catch (Exception $e) {
  echo $e->getMessage();
  break;
}
/* 
I'm setting other $dim properties like tab_dim...
...
...
*/
foreach ($dim->tab_dim as $date => $heures) {
  foreach ($heures as $heure => $val) {
    $save_tab_dim = $dim->getTabDim(); //$save_tab_dim = $dim->tab_dim
    echo "<br />AVANT = ";
    print_r($save_tab_dim);
    
    $dim->decremente_dim($date, $heure, 4);

    echo "<br />APRES = ";
    print_r($save_tab_dim); //$save_tab_dim changed like $dim->tab_dim but i don't want to...
  }
}

输出
数组在 key = 10 中更改

AVANT = Array ( [1621296000] => Array ( [7] => 0 [8] => 4 [9] => 4 [10] => 4 [11] => 4 [12] => 4 [13] => 4 [14] => 4 [15] => 4 [16] => 4 [17] => 0 ) )
APRES = Array ( [1621296000] => Array ( [7] => 0 [8] => 4 [9] => 4 [10] => 0 [11] => 4 [12] => 4 [13] => 4 [14] => 4 [15] => 4 [16] => 4 [17] => 0 ) ) 

昏暗类

class Dim
{
  public $datedeb     = null;
  public $datefin     = null;
  public $horairedeb  = null;
  public $horairefin  = null;
  public $tab_dim     = null;
  public $nb_max_heure= null;
  private $id_dim     = null;
  private $id_groupe  = null;
  private $id_activite= null;


  /******************************************************************************************
   ***** Constructeur de l'objet Dim : initialise le table de dimensionnement à NULL ********
   * @param $date_deb     * Date de debut de planning (Y-m-d)
   * @param $date_fin     * Date de fin de planning   (Y-m-d)
   * @param $horairedeb   * Horaire de début de planning = horaire de début de groupe (int)
   * @param $horairedeb   * Horaire de fin de planning = horaire de fin de groupe (int)
   * @param $nb_max_heure * nombre maximal d'heures planifiées par agent par date
   ******************************************************************************************/
  function __construct($date_deb, $date_fin, $horairedeb, $horairefin, $id_groupe, $id_activite)
  {
    if ($date_deb !="" &&  $date_fin!="" && is_numeric($id_groupe) && $id_groupe > 0 && $id_activite && is_numeric($horairedeb) && is_numeric($horairefin)
      && $horairedeb < $horairefin) {
      $this->id_groupe = $id_groupe;
      $this->id_activite = $id_activite;
      $this->datedeb = Tools::ConvertToSQLDate($date_deb);
      $this->datefin = Tools::ConvertToSQLDate($date_fin);
      if($this->datedeb <= $this->datefin){
        $diff_date = Tools::TempsEcoule($this->datedeb, $this->datefin);
        if($diff_date[0] <= 7){
          $this->horairedeb = $horairedeb;
          $this->horairefin = $horairefin;
          for ($dateboucle = strtotime($this->datedeb); $dateboucle <= strtotime($this->datefin); $dateboucle = strtotime(date('Y-m-d', $dateboucle) . ' +1 day')) {
            for ($horaire = $this->horairedeb; $horaire <= $horairefin; $horaire++) {
              $this->tab_dim[$dateboucle][$horaire] = null;
              $this->nb_max_heure[$dateboucle] = null;
            }
          }
        }
      }
    }
    //Si une des propriétés n'a pas pu être initialisé alors on renvoit une erreur (NE PAS OUBLIER DE TRY CATCH LORS DE LA CREATION DE L'OBJET)
    if ($this->checkPropriete() == false)
      throw new Exception('Paramètres non conformes, Tableau de dimmensionnement non construit');
  }

  /************************************************************************************
   ***** Vérifie l'instanciation des propriétés de l'objet (sauf tableau de dim)  *****
   * @return boolean
   ************************************************************************************/
  private function checkPropriete(){
    if($this->datedeb != null && $this->datefin != null && $this->horairedeb != null && $this->horairefin != null && $this->id_groupe != null && $this->id_activite != null && $this->tab_dim != null && $this->nb_max_heure != null)
      return true;
    else
      return false;
  }

  /************************************************************************
   ***** Affichage de l'objet Dim *****************************************
   * @param $dim * L'objet à afficher                                     *
   ************************************************************************/
  public static function displayDim(Dim $dim)
  {
    if (is_null($dim) == false && $dim->checkPropriete() === true) {
      $totalHeure = $dim->horairefin - $dim->horairedeb+2;
      $width      =  intval(100 / $totalHeure);
      $content = "<table style='width:100%;' border=1 frame=void rules=rows><tr>";
      $content .= "<th>Date</th>";
      for ($heure = $dim->horairedeb; $heure <= $dim->horairefin; $heure++) {
        $content .= "<th style='width:" . $width . "%'>" . $heure . "h<br />".($heure+1)."h</th>";
      }
      $content .= "<th style='width:" . $width . "%'>Nombre d'heures / agent</th>";
      if(isset($dim->tab_dim)){
        $content .= "<th style='width:" . $width . "%'>Action</th>";
      }
      $content .= "</tr>";

      for ($dateboucle = strtotime($dim->datedeb); $dateboucle <= strtotime($dim->datefin); $dateboucle = strtotime(date('Y-m-d', $dateboucle) . ' +1 day')) {
        $jour = date("d", $dateboucle);
        $mois = date("m", $dateboucle);
        $annee = date("Y", $dateboucle);
        $content .= "<tr><td>" . $jour . "/" . $mois . "</td>";
        for ($heure = $dim->horairedeb; $heure <= $dim->horairefin; $heure++) {
          if(isset($dim->tab_dim[$dateboucle][$heure]) && !is_null($dim->tab_dim[$dateboucle][$heure])) {
            if ($dim->tab_dim[$dateboucle][$heure] > 0) {$class="class='bg-danger'";}
            else if ($dim->tab_dim[$dateboucle][$heure] == ""){$class="class='bg-secondary'";}
            else {$class="class='bg-success'";}
             $content .= "<td style='width:" . $width . "%;'><input ".$class." type='text' style='text-align: center;color:#fff;border:0px;padding:2px;' max='99' maxlength='4' size='4' width='30' id='dim_" . $annee . "-" . $mois . "-" . $jour . "_" . $heure . "' value='" . $dim->tab_dim[$dateboucle][$heure] . "' /></td>";
          }
          else
            $content.= "<td style='width:" . $width . "%;'><input type='text' style='text-align: center;padding:2px;'  max='99' maxlength='4' size='4' id='dim_" . $annee . "-" . $mois . "-" . $jour . "_" . $heure . "' value='' /></td>";
        }
        if(isset($dim->nb_max_heure[$dateboucle]) && is_null($dim->nb_max_heure[$dateboucle]) == false){
          $content .= "<td style='width:" . $width . "%;' ><input style='width:100%;text-align: center;padding:2px;' type='text' min='0' max='12' maxlength='2' size='2' id='nb_max_heure_" . $annee . "-".$mois."-".$jour."' value='".$dim->nb_max_heure[$dateboucle]."'/></td>";
        }else {
          $content .= "<td style='width:" . $width . "%;' ><input style='width:100%;text-align: center;padding:2px;' type='text' min='0' max='12' maxlength='2' size='2' id='nb_max_heure_" . $annee . "-".$mois."-".$jour."' value='0'/></td>";
        }
        if(isset($dim->tab_dim[$dateboucle]) && !is_null($dim->tab_dim[$dateboucle]) && !is_null($dim->id_dim)) {
          $content .= "<td><img alt='' src='/img/supprimer.png' id='supp_" . $dim->getIdDimByDate($dateboucle) . "' onclick='supDateDim(".$dateboucle.", ".$dateboucle.", ".$dim->getIdDimByDate($dateboucle).")' title='".constant('bouton_suppression')."'>";
        }
        $content .= "</tr>";
      }
      $content .= "</table>";
      echo $content;
    }
    else{
      echo "";
    }
  }

  /************************************************************************
   ***** Encode en JSON le tableau de dimensionnement à une date précise **
   * @param $date_key * La date voulue                                    *
   * @return l'encodage en JSON                                           *
   ************************************************************************/
  public function encodeOneDate($date_key){
    if ((is_numeric($date_key) && (int)$date_key == $date_key)==false)
      $date_key = strtotime($date_key);
    if(($this->checkPropriete() == true) && (array_key_exists($date_key, $this->tab_dim))){
      return json_encode($this->tab_dim[$date_key]);
    }else{
      return null;
    }
  }

  /************************************************************************
   ***** Encode en JSON tout le tableau de dimensionnement                *
   * @return l'encodage en JSON                                           *
   ************************************************************************/
  public function encodeDim(){
    if($this->checkPropriete() == true){
      return json_encode($this->tab_dim);
    }else{
      return null;
    }
  }


  /***************************************************************************************
   ***** Met à jour (décrémente) le tableau de dimensionnement pour une activité donnée **
   * @param $date_evenement * La date de l'activité (Y-m-d)                              *
   * @param $heure_deb      * L'heure de début de l'activité (00:00)                     *
   * @param $heure_fin      * L'heure de fin de l'activité   (00:00)                     *
   ***************************************************************************************/
  public function MAJDim($date_evenement, $heure_deb_param, $heure_fin_param){
    $date_evenement = strtotime($date_evenement);

    //Conversion heure et min en INT
    $heure_deb = intval(substr($heure_deb_param,0,2));
    $min_deb   = intval(substr($heure_deb_param,3,2));
    $heure_fin = intval(substr($heure_fin_param,0,2));
    $min_fin   = intval(substr($heure_fin_param,3,2));

    //Si il n'y a aucune min de + on décrément de 1 pour chaque horaire
    if($min_fin == 0 && $min_deb == 0) {
      for ($i = $heure_deb; $i < $heure_fin; $i++) {
        $this->tab_dim[$date_evenement][$i]--;
      }
    }

    //Sinon on décrémente du pourcentage d'heure (nb_min / 60)
    else{
      if($min_fin != 0 && $heure_fin > $heure_deb)
        $heure_fin++;
      if($min_fin != 0 && $heure_fin == $heure_deb){
        $this->tab_dim[$date_evenement][$heure_deb]-= ($min_fin-$min_deb)/60;
        return;
      }
      for ($i = $heure_deb; $i < $heure_fin; $i++) {
        if($i == $heure_deb && $min_deb != 0){
          $this->tab_dim[$date_evenement][$i]-= (60-$min_deb)/60;
        }
        else if ($i == $heure_fin-1 && $min_fin != 0){
          $this->tab_dim[$date_evenement][$i]-= $min_fin/60;
        }
        else{
          $this->tab_dim[$date_evenement][$i]--;
        }
      }
    }
  }

  /********************************************************************************
   ***** décrémente le tableau de dimensionnement à une date et une heure donnée **
   * @param int $date     * La date du tableau de dim                             *
   * @param int $heure    * L'heure souhaitée                                     *
   * @param float $valeur * La valeur à décrémenter                               *
   ********************************************************************************/

  public function decremente_dim($date,$heure,$valeur){
    if (is_numeric($heure) && is_numeric($valeur) && is_numeric($date) && isset($this->tab_dim[$date][$heure]))
    {
      $valeur = round($valeur,2);
      $this->tab_dim[$date][$heure] -= $valeur;
    }
  }

  /************************************************************************
   ***** Les Setters  *****                                               *
   ************************************************************************/
  public function setIdDim($id)
  {
    $this->id_dim = $id;
  }

  public function setTabDim($tab_dim)
  {
    $this->tab_dim = $tab_dim;
  }

  public function setMaxHeure($nb_max_heure)
  {
    $this->nb_max_heure = $nb_max_heure;
  }

  public function setDatedeb()
  {
    return "";
  }

  public function setDatefin()
  {
    return "";
  }

  public function setHorairedeb()
  {
    return "";
  }

  public function setHorairefin()
  {
    return "";
  }

  /************************************************************************
   ***** Les Getters *****************************************
   ************************************************************************/
  public function getTabDim()
  {
    return $this->tab_dim;
  }
  public function getIdGroupe()
  {
    return $this->id_groupe;
  }

  public function getIdActivite()
  {
    return $this->id_activite;
  }

  public function getIdDim()
  {
    return $this->id_dim;
  }

  public function getIdDimByDate($date_key)
  {
    if ((is_numeric($date_key) && (int)$date_key == $date_key)==false)
      $date_key = strtotime($date_key);
    if(($this->checkPropriete() == true) && (array_key_exists($date_key, $this->id_dim))){
      return $this->id_dim[$date_key];
    }else{
      return null;
    }
  }
}

标签: phparrayspointersmultidimensional-array

解决方案


推荐阅读