Last active
October 10, 2015 16:27
-
-
Save gfazioli/3718141 to your computer and use it in GitHub Desktop.
Object Combine
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Do a merge/combine between two object tree. | |
* If the old version not contains an object or property, that is added. | |
* If the old version contains an object or property less in last version, that is deleted. | |
* | |
* @brief Object delta compare for combine | |
* | |
* @param mixed $last_version Object tree with new or delete object/value | |
* @param mixed $old_version Current Object tree, loaded from serialize or database for example | |
* | |
* @return Object the delta Object tree | |
*/ | |
function wpdk_delta_object( $last_version, $old_version ) { | |
$last_version_stack = array(); | |
$old_version_stack = array(); | |
/* Creo un elenco di tutte le proprietà della classe $old_version. Questo elenco mi indica il nome della | |
proprietà e il tipo. | |
*/ | |
foreach ( $old_version as $key => $value ) { | |
$old_version_stack[$key] = $value; | |
} | |
/* Ora ciclo nella versione recente */ | |
foreach ( $last_version as $key => $value ) { | |
/* Se la precedente versione non contiene la proprietà di quella nuova, la imposto con il valore di default. */ | |
if ( !isset( $old_version_stack[$key] ) ) { | |
$old_version->$key = $value; | |
} | |
elseif ( empty( $old_version_stack[$key] ) || is_null( $old_version_stack[$key] ) ) { | |
$old_version->$key = $value; | |
} | |
/* La proprietà esiste. */ | |
else { | |
/* Se la proprietà c'è potrebbe essere a sua volta un oggeto, quindi controllo ed eventualmente ciclo su | |
questo. | |
*/ | |
if ( is_object( $value ) ) { | |
wpdk_delta_object( $value, $old_version->$key ); | |
} | |
} | |
} | |
/* Precedentemente abbiamo controllato per 'mancanze' nella vecchia classe, ora facciamo un controllo speculare | |
cioè verifichiamo che la nuova struttura non abbia eliminato qualcosa. | |
Come nel caso precedente creo un elenco delle proprietà dell'ultima versione. | |
*/ | |
foreach ( $last_version as $key => $value ) { | |
$last_version_stack[$key] = $value; | |
} | |
/* Ora ciclo nella vecchia versione */ | |
foreach ( $old_version as $key => $value ) { | |
/* Se non esiste più questa proprietà... */ | |
if ( !isset( $last_version_stack[$key] ) ) { | |
/* La elimino */ | |
unset( $old_version->$key ); | |
} | |
} | |
/* Ok, $old_version ora è allineata. */ | |
return $old_version; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment