Skip to content

Instantly share code, notes, and snippets.

@anver
Created July 31, 2018 13:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anver/ddb76521d0e8c96ce4566944cbda0026 to your computer and use it in GitHub Desktop.
Save anver/ddb76521d0e8c96ce4566944cbda0026 to your computer and use it in GitHub Desktop.
function get_matrix( $depths ) {
$all_users = $this->get_all_users();
$depths = [3, 3, 3];
$matrix = [];
for ( $level = 0; $level < count( $depths ); $level++ ) {
$total_members = pow( $depths[$level], $level + 1 );
$members = json_decode( json_encode( array_splice( $all_users, 0, $total_members ), JSON_FORCE_OBJECT ) );
$members_arr = json_decode( json_encode( $members ), TRUE );
$iter = new RecursiveIteratorIterator( new RecursiveArrayIterator( $members ), RecursiveIteratorIterator::SELF_FIRST );
while ( $iter->valid() ) {
$arr_depth = $iter->getDepth();
$iterator_arr = $iter->getSubIterator( $arr_depth )->getArrayCopy();
if ( pow( $depths[$level], $level ) == 1 && empty( $matrix ) ) {
$matrix[] = $iterator_arr;
break;
}
if ( !empty( $matrix ) && $level > 0 ) {
// $matrix_arr = json_decode( json_encode( $matrix, JSON_FORCE_OBJECT ) );
$matrix_arr = new ArrayObject( $matrix );
$miter = new RecursiveIteratorIterator( new RecursiveArrayIterator( $matrix_arr ), RecursiveIteratorIterator::SELF_FIRST );
while ( $miter->valid() ) {
$mdepth = $miter->getDepth();
$mkey = $miter->key();
$mval = $miter->current();
$marr = $miter->getInnerIterator()->getArrayCopy();
if ( $level == 1 && $mdepth == 1 ) {
$user['id'] = $mval;
$user['children'] = array_splice( $members_arr, 0, 3 );
$this->loop( $user, $miter );
for ( $msub = $mdepth; $msub >= 0; $msub-- ) {
$subIterator = $miter->getSubIterator( $msub );
$sub_arr = $subIterator->getArrayCopy();
$sub_val = $subIterator->current();
$sub_key = $subIterator->key();
if ( $msub == $mdepth ) {
$subIterator->offsetSet( $sub_key, $user );
} else {
$parent_arr_copy = $miter->getSubIterator( $msub + 1 )->getArrayCopy();
$subIterator->offsetSet( $sub_key, $parent_arr_copy );
}
}
}
if ( $level >= 2 && $mdepth > $level && $mdepth <= count( $depths ) ) {
$user['id'] = $mval;
$user['children'] = array_splice( $members_arr, 0, 3 );
for ( $msub = $mdepth; $msub >= 0; $msub-- ) {
$subIterator = $miter->getSubIterator( $msub );
$sub_arr = $subIterator->getArrayCopy();
$sub_val = $subIterator->current();
$sub_key = $subIterator->key();
if ( $msub == $mdepth ) {
$subIterator->offsetSet( $sub_key, $user );
} else {
$parent_arr_copy = $miter->getSubIterator( $msub + 1 )->getArrayCopy();
$subIterator->offsetSet( $sub_key, $parent_arr_copy );
}
}
}
if ( empty( $members_arr ) ) {
$matrix = json_decode( json_encode( $matrix_arr, JSON_FORCE_OBJECT ), TRUE );
break 2;
}
if ( $mdepth > $level && $level == 1 ) {
$matrix = json_decode( json_encode( $matrix_arr, JSON_FORCE_OBJECT ), TRUE );
break;
}
if ( ($mdepth > $level && $mdepth > count( $depths ) ) && $level != 1 ) {
$matrix = json_decode( json_encode( $matrix_arr, JSON_FORCE_OBJECT ), TRUE );
break;
}
$miter->next();
}
}
$iter->next();
}
}
return $matrix;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment