php - 有没有办法在不引用 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;
}
}
}
解决方案
推荐阅读
- python - 如何制作多个移动点的动画?
- r - 在 data.frame 中带有符号的 OHCL 数据,需要通过符号 (R) 提取唯一关闭数
- docker - 将 Container 连接到网络中的外部计算机
- express - Mongoose 防止字段被大量分配
- amazon-web-services - 如果我在没有 MaxResults 的情况下调用 EC2 客户端的“describe_instances”函数,它会返回所有实例吗?
- vb.net - 当从文本框字符串“单击”vb表单按钮时如何执行命令,然后在richtextbox中显示输出
- visual-studio-2017 - 为什么 Windows 10 升级使用 IIS Express 破坏了 VS 2017?
- html - 使引导 div 响应
- html - 用 Excel 工作表中的 HTML 标记替换上标和斜体
- google-apps-script - 使用 setColumnFilterCriteria 后如何从 Filter 中获取过滤值?