2011-07-28 7 views
2

Je veux trier tous les tableaux PHP en fonction du premier tableau principal.créer un tableau php basé sur un autre tableau.

C'est le tableau principal que je veux utiliser pour trier tous les autres tableaux:

Array (

[0] => 10 
[1] => 14 
[2] => 15 
[3] => 20 
[4] => 21 
[5] => 24 
[6] => 25 
[7] => 28 
[8] => 30 
[9] => 45 
[10] => 60 
[11] => 90 
[12] => 120 
[13] => 150 
[14] => 180 
[15] => 210 
[16] => 240 
[17] => 270 
[18] => 365 

) 

Ce sont des tableaux qui doivent être triés:

Array (

[0] => Array 
    (
     [14] => 49.21 
     [20] => 71.04 
     [25] => 89.58 
     [30] => 100.00 
    ) 

[1] => Array 
    (
     [180] => 412.00 
     [150] => 347.00 
     [120] => 285.00 
     [90] => 224.00 
     [60] => 165.00 
     [30] => 100.00 
     [14] => 47.00 
    ) 

)

J'ai besoin ce résultat final ressemble à ceci:

Array (

[0] => Array 
    (
     [10] => n/a 
     [14] => 49.21 
     [15] => n/a 
     [20] => 71.04 
     [21] => n/a 
     [24] => n/a 
     [25] => 89.58 
     [28] => n/a 
     [30] => 100.00 
     [45] => n/a 
     [60] => n/a 
     [90] => n/a 
     [120] => n/a 
     [150] => n/a 
     [180] => n/a 
     [210] => n/a 
     [240] => n/a 
     [270] => n/a 
     [365] => n/a 
    ) 

[1] => Array 
    (
     [10] => n/a 
     [14] => 71.04 
     [15] => n/a 
     [20] => n/a 
     [21] => n/a 
     [24] => n/a 
     [25] => n/a 
     [28] => n/a 
     [30] => 100.00 
     [45] => n/a 
     [60] => 165.00 
     [90] => 224.00 
     [120] => 285.00 
     [150] => 347.00 
     [180] => 412.00 
     [210] => n/a 
     [240] => n/a 
     [270] => n/a 
     [365] => n/a 
    ) 

    ) 

Merci.

+1

"Court-circuit"? Trié? – deceze

+0

Ne ressemble pas exactement à trier pour moi. Pouvez-vous expliquer ce que vous voulez faire? Pour moi, il ressemble à remplir le tableau avec des clés inutilisées, puis le tri par ces touches (ce qui pourrait être fait par 'ksort') – Nobody

Répondre

0

Si je comprends bien à partir de votre question, vous voulez faire les deux tableaux de la même longueur et mettre les clés non à "n/a".

Variant avec array_merge (Demo):

$shorten = array(
    0 => 10, 
    1 => 14, 
    2 => 15, 
    3 => 20, 
    4 => 21, 
    5 => 24, 
    6 => 25, 
    7 => 28, 
    8 => 30, 
    9 => 45, 
    10 => 60, 
    11 => 90, 
    12 => 120, 
    13 => 150, 
    14 => 180, 
    15 => 210, 
    16 => 240, 
    17 => 270, 
    18 => 365, 
); 

$data = array(
    0 => array(
    14 => '49.21', 
    20 => '71.04', 
    25 => '89.58', 
    30 => '100.00', 
), 
    1 => array(
    180 => '412.00', 
    150 => '347.00', 
    120 => '285.00', 
    90 => '224.00', 
    60 => '165.00', 
    30 => '100.00', 
    14 => '47.00', 
), 
); 

// default array as the base 
$shorten = array_combine($shorten, array_fill(0, count($shorten), 'n/a')); 

foreach($data as &$array) { 
    // merge to get set members 
    $array = array_merge($shorten, $array); 
} 
unset($array); 

var_dump($data); 

Résultat:

array(2) { 
    [0]=> 
    array(23) { 
    [0]=> 
    string(3) "n/a" 
    [1]=> 
    string(3) "n/a" 
    [2]=> 
    string(3) "n/a" 
    [3]=> 
    string(3) "n/a" 
    [4]=> 
    string(3) "n/a" 
    [5]=> 
    string(3) "n/a" 
    [6]=> 
    string(3) "n/a" 
    [7]=> 
    string(3) "n/a" 
    [8]=> 
    string(3) "n/a" 
    [9]=> 
    string(3) "n/a" 
    [10]=> 
    string(3) "n/a" 
    [11]=> 
    string(3) "n/a" 
    [12]=> 
    string(3) "n/a" 
    [13]=> 
    string(3) "n/a" 
    [14]=> 
    string(3) "n/a" 
    [15]=> 
    string(3) "n/a" 
    [16]=> 
    string(3) "n/a" 
    [17]=> 
    string(3) "n/a" 
    [18]=> 
    string(3) "n/a" 
    [19]=> 
    string(5) "49.21" 
    [20]=> 
    string(5) "71.04" 
    [21]=> 
    string(5) "89.58" 
    [22]=> 
    string(6) "100.00" 
    } 
    [1]=> 
    array(26) { 
    [0]=> 
    string(3) "n/a" 
    [1]=> 
    string(3) "n/a" 
    [2]=> 
    string(3) "n/a" 
    [3]=> 
    string(3) "n/a" 
    [4]=> 
    string(3) "n/a" 
    [5]=> 
    string(3) "n/a" 
    [6]=> 
    string(3) "n/a" 
    [7]=> 
    string(3) "n/a" 
    [8]=> 
    string(3) "n/a" 
    [9]=> 
    string(3) "n/a" 
    [10]=> 
    string(3) "n/a" 
    [11]=> 
    string(3) "n/a" 
    [12]=> 
    string(3) "n/a" 
    [13]=> 
    string(3) "n/a" 
    [14]=> 
    string(3) "n/a" 
    [15]=> 
    string(3) "n/a" 
    [16]=> 
    string(3) "n/a" 
    [17]=> 
    string(3) "n/a" 
    [18]=> 
    string(3) "n/a" 
    [19]=> 
    string(6) "412.00" 
    [20]=> 
    string(6) "347.00" 
    [21]=> 
    string(6) "285.00" 
    [22]=> 
    string(6) "224.00" 
    [23]=> 
    string(6) "165.00" 
    [24]=> 
    string(6) "100.00" 
    [25]=> 
    string(5) "47.00" 
    } 
} 

Variant avec la fonction de mappage (Demo):

$shorten = array(
    0 => 10, 
    1 => 14, 
    2 => 15, 
    3 => 20, 
    4 => 21, 
    5 => 24, 
    6 => 25, 
    7 => 28, 
    8 => 30, 
    9 => 45, 
    10 => 60, 
    11 => 90, 
    12 => 120, 
    13 => 150, 
    14 => 180, 
    15 => 210, 
    16 => 240, 
    17 => 270, 
    18 => 365, 
); 

// overload $shorten array with a mapping function 
$shorten = function(array $a) use ($shorten) 
{ 
    $r = array(); 
    foreach($shorten as $i => $k) 
    { 
     $r[$k] = isset($a[$k]) ? $a[$k] : 'n/a'; 
    } 
    return $r; 
}; 


$data = array(
    0 => array(
    14 => '49.21', 
    20 => '71.04', 
    25 => '89.58', 
    30 => '100.00', 
), 
    1 => array(
    180 => '412.00', 
    150 => '347.00', 
    120 => '285.00', 
    90 => '224.00', 
    60 => '165.00', 
    30 => '100.00', 
    14 => '47.00', 
), 
); 

// apply mapping function to $data 
$data = array_map($shorten, $data); 

var_dump($data); # result 

Résultat:

array(2) { 
    [0]=> 
    array(19) { 
    [10]=> 
    string(3) "n/a" 
    [14]=> 
    string(5) "49.21" 
    [15]=> 
    string(3) "n/a" 
    [20]=> 
    string(5) "71.04" 
    [21]=> 
    string(3) "n/a" 
    [24]=> 
    string(3) "n/a" 
    [25]=> 
    string(5) "89.58" 
    [28]=> 
    string(3) "n/a" 
    [30]=> 
    string(6) "100.00" 
    [45]=> 
    string(3) "n/a" 
    [60]=> 
    string(3) "n/a" 
    [90]=> 
    string(3) "n/a" 
    [120]=> 
    string(3) "n/a" 
    [150]=> 
    string(3) "n/a" 
    [180]=> 
    string(3) "n/a" 
    [210]=> 
    string(3) "n/a" 
    [240]=> 
    string(3) "n/a" 
    [270]=> 
    string(3) "n/a" 
    [365]=> 
    string(3) "n/a" 
    } 
    [1]=> 
    array(19) { 
    [10]=> 
    string(3) "n/a" 
    [14]=> 
    string(5) "47.00" 
    [15]=> 
    string(3) "n/a" 
    [20]=> 
    string(3) "n/a" 
    [21]=> 
    string(3) "n/a" 
    [24]=> 
    string(3) "n/a" 
    [25]=> 
    string(3) "n/a" 
    [28]=> 
    string(3) "n/a" 
    [30]=> 
    string(6) "100.00" 
    [45]=> 
    string(3) "n/a" 
    [60]=> 
    string(6) "165.00" 
    [90]=> 
    string(6) "224.00" 
    [120]=> 
    string(6) "285.00" 
    [150]=> 
    string(6) "347.00" 
    [180]=> 
    string(6) "412.00" 
    [210]=> 
    string(3) "n/a" 
    [240]=> 
    string(3) "n/a" 
    [270]=> 
    string(3) "n/a" 
    [365]=> 
    string(3) "n/a" 
    } 
} 
+0

Merci fonctionne comme je le voulais. – gt29

1

En supposant que votre tableau initial est $ source et todo $ est votre deuxième tableau avec les deux sous-ensembles, puis:

$keys = array_flip($todo); 
$keys = array_map(function() { return 'n/a'; }, $keys); // set all values to be "n/a"; 

foreach($todo as $idx => $do) { 
    $todo[$idx] = $do + $keys; // merge without renumbering. 
} 
+0

Je pensais aussi à l'union des tableaux, mais l'ordre des clefs de $ todo n'est pas conservé, il est ajouté derrière. Ça ne doit pas être un problème de toute façon. – hakre

+0

assez vrai, mais assez facile de ksort() après, si cela devient un problème. –

Questions connexes