Skip to content

Instantly share code, notes, and snippets.

@gfazioli
Last active October 10, 2015 16:27
Show Gist options
  • Save gfazioli/3718141 to your computer and use it in GitHub Desktop.
Save gfazioli/3718141 to your computer and use it in GitHub Desktop.
Object Combine
<?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