2010-07-20 4 views
0

J'ai un tableau qui ressemble à ceci:Essayer de modifier un tableau pour éviter des paires de chevauchement clé-valeur en utilisant PHP

Array([5258]=>5274, 
     [5261]=>5281, 
     [5264]=>5287, 
     [5271]=>5289); 

Je veux modifier ce tableau afin que tous les chevauchements dans les principaux paires de valeur ont été supprimées. Pour élaborer, la première paire de valeurs de clé doit devenir [5258]=>5289, car la valeur numérique de chacune des autres clés est inférieure à 5274, la valeur d'origine correspondant à la première clé.

Quelle serait la meilleure façon de le faire en utilisant PHP? J'apprécierai quelques indications à ce sujet.

Merci.

EDIT: Juste un Reformuler au fond de ma question: S'il y a un tableau comme celui-ci:

Array([10]=>12 
     [11]=>15 
     [16]=>20) 

Je veux obtenir un autre tableau/modifier le même tableau pour obtenir

Array([10]=>15 
     [16]=>20) 

J'espère que cela rend les choses plus claires.

+2

J'ai lu ce 5 fois comme, et je reste juste ne l'obtiennent pas . –

+1

Cela n'a aucun sens pour moi ... pourquoi la valeur de [5258] deviendrait-elle 5289? Que deviendrait la valeur de [5261]? – Fosco

+1

Essayez-vous simplement de trouver les nombres les plus élevés et les plus bas dans la clé/les valeurs? Peut-être qu'une note rapide sur le contexte nous aiderait à comprendre ... – Eli

Répondre

1

Est-ce un jeu de deviner la question réelle?

Voici ma réponse à ce que je pense que la question est:

$arr = Array(
    5258=>5274, 
    5261=>5281, 
    5264=>5287, 
    1=>100, 
    50=>70, 
    40=>130, 
    5271=>5289 
); 

ksort($arr); 
$out = array(); 
$start = null; 
foreach ($arr as $from=>$to) 
{ 
    if ($start === null) 
    { 
     $start = $from; 
     $end = $to; 
    } else { 
     if ($from < $end) 
     { 
      $end = max($end,$to); 
     } else { 
      $out[$start] = $end; 
      $start = null; 
     } 
    } 
} 
if ($start !== null) $out[$start] = $end; 

print_r($out); 

sortie:

Array 
(
    [1] => 130 
    [5261] => 5289 
) 
+0

Merci, cela semble fonctionner. Je trace le code aussi. Vraiment désolé de ne pas être clair en posant ma question. – Enthusiast

-2

Jetez un oeil à usort() mais je ne suis pas tout à fait sûr comment cela fonctionne. C'est un peu de magie noire pour moi. Devinez, faites une fonction qui compare les valeurs clés et ordonne le tableau comme ça.

Ou vous pouvez bricoler avec array_merge()

Toutes mes excuses pour une réponse waffling, je ne comprends pas bien votre question, ou les critères de la façon dont vous souhaitez fusionner/trier votre tableau

+0

'usort' fonctionne en appelant votre fonction de comparaison pour chaque élément du tableau. Votre fonction prend deux arguments, chacun un élément de tableau. Vous comparez les deux comme vous voulez et renvoyez -1 si le premier devrait être premier, 1 si le second devrait être le premier, et 0 si ce n'est pas important. Donc, maintenant que tout est réglé - 'usort' n'aiderait pas parce qu'il veut mélanger les clés et les valeurs, pas simplement trier un tableau. Je pense. – JAL

+0

Ni l'un ni l'autre n'a à voir avec le problème en effet. – Wrikken

0
<?php 
$arr = array(5258=>5274, 
     5261=>5281, 
     5264=>5287, 
     5271=>5289 , 
     5301=>5400); 

ksort($arr); 
$new = array(); 
$currentkey = reset(array_keys($arr)); 
$currentvalue = reset($arr); 
foreach($arr as $key=>$value){ 
    if($key > $currentvalue){ 
     $new[$currentkey] = $currentvalue; 
     $currentkey = $key; 
    } 
    $currentvalue = max($currentvalue,$value); 
} 
$new[$currentkey] = $currentvalue; 
var_dump($new); 
?> 
+0

cela casse sur certaines plages de chevauchement – mvds

+0

remplacer '$ currentvalue = $ value;' par '$ currentvalue = max ($ currentvalue, $ value);' réparer. – mvds

+0

Ah, quelque chose qui n'était pas dans l'exemple en effet, appliquera correctif. – Wrikken

Questions connexes