Notatki PHP

prywatne zapiski na kamieniu

Czasami dla celów przetwarzania danych, należy dokonać agregacji danych i ustalić tabelę w odwrotnym porządku.

 
function flipAndGroup($input) {
    $outArr = array();
    array_walk($input, function($value, $key) use (&$outArr) {
        if(!isset($outArr[$value]) || !is_array($outArr[$value])) {
            $outArr[$value] = [];
        }
        $outArr[$value][] = $key;
    });
    return $outArr;
}

 

Tabela do zbadania - nazwy użytkowników i kraje z jakich pochodzą:

 
$users_countries = array(
    'username1' => 'US',
    'user2' => 'US',
    'newuser' => 'GB'
);
print_r(flipAndGroup($users_countries));
?>
 

Statystyka wynikająca z badania tą funkcją:

 
Array
(
    [US] => Array
        (
            [0] => username1
            [1] => user2
        )
 
    [GB] => Array
        (
            [0] => newuser
        )
)

 

Kolejny przykład:

 
 
$base= array('one', 'two', 'three');
 
$tosort= array('a'=>'two', 'b'=>'three', 'c'=>'five', 'd'=>'one', 'and'=>'four', 'f'=>'one');
 
uasort($tosort, function($key1, $key2) use ($base) {
  $a1=array_search($key1, $base);
  $a2=array_search($key2, $base);
 
  if ( $a1===false && $a2===false ) { return 0; }
  else if ( $a1===false && $a2 !== false) { return 1; }
  else if ( $a1!==false && $a2 === false) {return -1;}
 
  if( $a1 > $a2 ) { return 1; }
  else if ( $a1 < $a2 ) { return -1; }
  else if ( $a1 == $a2 ) { return 0; }       
});
var_dump($tosort);

Otrzymamy na końcu powstałej tablicy klucze unikalne, po uporządkowaniu:

 
array (6)
d => "one" (3)
f => "one" (3)
a => "two" (3)
b => "three" (5)
c => "five" (4)
and => "four" (4)