Tri tableau array en PHP

poupilou

WRInaute impliqué
Salut à tous,

J'ai 2 array ci-dessous :
Code:
$headers1 = array('0','1','5','10','20','30','40','50','100','200','300','400','500');
$headers2 = array('a','b','c',d','e','f','g','h','i','j','k','l','m','n');
J'ai une variable php $nb = 400;

Je voudrais afficher seulement 3 valeurs maximum des array $headers1 et $headers2 avant ma variable $nb et 3 valeurs maximum des array $headers1 et $headers2 après ma variable $nb, comment faire cela ?

Si $ns = 400, ça devrait m'afficher les valeurs suivantes :
100, 200, 300, 400, 500
j, k, l, m, n

Si $ns = 40, ça devrait m'afficher les valeurs suivantes :
10, 20, 30, 40, 50, 100, 200
d, e, f, g, h, i, j

Si $ns = 0, ça devrait m'afficher les valeurs suivantes :
0, 1, 5, 10
a, b, c, d

Merci pour votre aide.
 

poupilou

WRInaute impliqué
Non, il doit avoir le même nombre.

Le voici corrigé :
Code:
$headers2 = array('a','b','c',d','e','f','g','h','i','j','k','l','m');
 

rick38

WRInaute passionné
Je crois pas qu'il y ait de chose magique, donc je t'ai fait un code basique.
Il y a une autre façon (prendre l'élément, puis remonter les 3 (max) précédents, puis descendre les 3 (max) suivants), peut-être plus courte je sais pas...

PHP:
$headers1 = ['0','1','5','10','20','30','40','50','100','200','300','400','500'];
$headers2 = ['a','b','c', 'd','e','f','g','h','i','j','k','l','m'];

$nb = '400'; // Exemple
$index = array_search($nb, $headers1);

if ($index !== false)
{
    $first = $index - 3;
    $total = $first < 0 ? 7 + $first : 7;
    $ct = count($headers1);

    $j = 0;
    $h1 = [];
    $h2 = [];
    for ($i = max($first, 0); $i < $ct && $j < $total; $i++)
    {
        $h1[] = $headers1[$i];
        $h2[] = $headers2[$i];
        $j++;
    }

    echo implode(', ', $h1);
    echo '<br>';
    echo implode(', ', $h2);
}
 
Dernière édition:

poupilou

WRInaute impliqué
Absolument parfait, bravo :)

Est-il possible d'apporter une petite modification ?

Parfois le $nb ne sera pas un chiffre contenu dans $headers1, il faudrait donc sélectionner le premier chiffre dans $headers1 qui soit supérieur à $nb. Par exemple si $nb = 12 il faudrait sélectionner le chiffre 20 dans $headers1 ainsi que les 3 chiffres devant et après 20, comment faire ?
 

rick38

WRInaute passionné
Remplacer $index = array_search($nb, $headers1); par :

PHP:
    $index = false;
    foreach ($headers1 as $key => $value)
    {
        if ($value >= $nb)
        {
                $index = $key;
                break;
        }
    }
 

colonies

WRInaute impliqué
Remplacer $index = array_search($nb, $headers1); par :
Pourquoi ? C'était bien, array_search, non ?

Ma version :
PHP:
$headers1 = ['0','1','5','10','20','30','40','50','100','200','300','400','500'];
$headers2 = ['a','b','c', 'd','e','f','g','h','i','j','k','l','m'];

get_slice(400, $headers1, $headers2);
get_slice(40, $headers1, $headers2);
get_slice(0, $headers1, $headers2);

function get_slice($nb, $headers1, $headers2)
{
    $index = array_search((string) $nb, $headers1, TRUE);
    if ($index === FALSE)
        return FALSE;

    $first = max($index - 3, 0);
    $length = 7 + min($index - 3, 0);
 
    $sub1 = array_splice($headers1, $first, $length);
    $sub2 = array_splice($headers2, $first, $length);
 
    echo implode(', ', $sub1)
        . '<br>'
        . implode(', ', $sub2)
        . '<hr>';

    return [$sub1, $sub2]; // par exemple.
}
 
Dernière édition:

colonies

WRInaute impliqué
Parce qu'il veut que si ça ne trouve pas, ça prenne la première valeur supérieure.
Ah ouais, je n'avais pas lu sa réponse au-delà de "Absolument parfait" :-/

Du coup, même modif pour ma version : ton bout de code pour remplacer :
PHP:
    $index = array_search((string) $nb, $headers1, TRUE);
    if ($index === FALSE)
        return FALSE;

En gros, la différence de ma version, c'est qu'elle utilise array_slice au lieu d'une boucle : c'est fait pour.
 

Discussions similaires

Haut