Ottieni l'indice di un certo valore in un array in PHP


87

Ho un array:

$list = array('string1', 'string2', 'string3');

Voglio ottenere l'indice per un dato valore (cioè 1per string2e 2per string3)

Tutto quello che voglio è la posizione delle stringhe nell'array

  • string1 è 0
  • string2 è 1
  • string3 è 2

Come ottenerlo?


8
Un mio amico scrittore di tecnologia mi ha detto: "non puoi ottenere le risposte giuste se non fai le domande giuste".
Bill Karwin

questo è vecchio ... ma vorrei sapere perché: "Ho provato array_search ma non è stato utile"
dsdsdsdsd

Per favore, contrassegna la risposta con il punteggio più alto come accettata.
robsch

Se hai un array associativo, come ho fatto io, questa risposta aiuta: stackoverflow.com/a/3365793/470749
Ryan

Risposte:


159

array_search è il modo per farlo.

array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : mixed

Dai documenti :

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

Puoi eseguire il ciclo sull'array manualmente e trovare l'indice, ma perché farlo quando c'è una funzione per quello. Questa funzione restituisce sempre una chiave e funzionerà bene con array associativi e normali.


11
Ciò restituisce la chiave, non l'indice. Nel tuo esempio la chiave è convenientemente l'indice del valore.
Jorge Ferreira

1
@smink, l'array dell'OP è un array non associativo, quindi funziona bene.
Matthew Flaschen

scusa, non ho specificato il tipo di array. L'array che uso è un array multidimensionale, per favore vedi la mia risposta per la soluzione
Aakash Chakravarthy

Ho questo tipo di array: [0 => {id: 1, name: something}, 1 => {.....}, ...]. è possibile trovare la chiave / indice come array_search ("name" => qualcosa, $ array)?
lazzy_ms

Che ne dici se l'array ha un bambino?
zukijuki

19

Se ne stai facendo solo alcuni (e / o la dimensione dell'array è grande), allora eri sulla strada giusta con array_search:

$list = array('string1', 'string2', 'string3');
$k = array_search('string2', $list); //$k = 1;

Se vuoi tutti (o molti di loro), un ciclo probabilmente ti farà meglio:

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "

1
il foreach è ciò di cui avevo bisogno
zzapper

11

Altre persone hanno suggerito array_search()quale sia la chiave dell'elemento dell'array in cui si trova il valore. Puoi assicurarti che le chiavi dell'array siano numeri interi contigui utilizzando array_values():

$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3');
$index = array_search('string2', array_values($list));
print "$index\n";

// result: 1

Hai detto nella tua domanda che array_search()era inutile. Puoi spiegare perché? Cosa hai provato e come non ha soddisfatto le tue esigenze?


"array_values ​​() was no use" .. should be "array_search () was no use"
Vex

7

// o considerando la struttura dell'array:

$array = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => ''),
);

// potresti semplicemente

function findIndexOfKey($key_to_index,$array){
  return array_search($key_to_index,array_keys($array));
}

// eseguito

print "\r\n//-- Method 1 --//\r\n";
print '#index of: string1 = '.findIndexofKey('string1',$array)."\r\n";
print '#index of: string2 = '.findIndexofKey('string2',$array)."\r\n";
print '#index of: string3 = '.findIndexofKey('string3',$array)."\r\n";

// in alternativa

print "\r\n//-- Method 2 --//\r\n";
print '#index of: string1 = '.array_search('string1',array_keys($array))."\r\n";
print '#index of: string2 = '.array_search('string2',array_keys($array))."\r\n";
print '#index of: string3 = '.array_search('string3',array_keys($array))."\r\n";

// in modo ricorsivo

print "\r\n//-- Method 3 --//\r\n";
foreach(array_keys($array) as $key => $value){
  print '#index of: '.$value.' = '.$key."\r\n";
}

// output

//-- Method 1 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 2 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 3 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

6

Il problema è che non hai un indice numerico sul tuo array.
L'uso di array_values ​​() creerà un array indicizzato zero che puoi quindi cercare usando array_search () evitando la necessità di usare un ciclo for.

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));

questo è finora il metodo più breve e funzionante per la domanda,
Toni Tegar Sahidi

1

Potresti essere un po 'più specifico?

$key = array_search('string2',$list)

funziona bene per me. Stai cercando di realizzare qualcosa di più complesso?


1

Questo codice dovrebbe fare lo stesso della tua nuova routine, lavorando con l'array multidimensionale corretto.

 $arr = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => '')
 );

 echo 'Index of "string2" = '. array_search('string2', array_keys($arr));

1
La domanda non menziona nulla sugli array multidimensionali (i commenti dell'OP in altre risposte suggeriscono che questa risposta è ciò che stava effettivamente cercando, ma se leggi solo la domanda originale e questa risposta, ciò che stai dicendo non ha senso)
Testardo

1

Dovrai creare una funzione per questo. Non penso che ci sia alcuna funzione incorporata per questo scopo. Tutti gli array PHP sono associativi per impostazione predefinita. Quindi, se non sei sicuro delle loro chiavi, ecco il codice:

<?php

$given_array = array('Monday' => 'boring',
'Friday' => 'yay',
'boring',
'Sunday' => 'fun',
7 => 'boring',
'Saturday' => 'yay fun',
'Wednesday' => 'boring',
'my life' => 'boring');

$repeating_value = "boring";

function array_value_positions($array, $value){
    $index = 0;
    $value_array = array();
        foreach($array as $v){
            if($value == $v){
                $value_array[$index] = $value;
            }
        $index++;
        }
    return $value_array;
}

$value_array = array_value_positions($given_array, $repeating_value);

$result = "The value '$value_array[0]' was found at these indices in the given array: ";

$key_string = implode(', ',array_keys($value_array));

echo $result . $key_string . "\n";//Output: The value 'boring' was found at these indices in the given array: 0, 2, 4, 6, 7


0

Prova la funzione PHP array_keys.

$key_string1 = array_keys($list, 'string1');

quei parametri non sono invertiti ?
ashleedawg

@ashleedawg No hai letto male, array_keysè diverso daarray_search
Un amico

0

array_search dovrebbe funzionare bene, l'ho appena testato e restituisce le chiavi come previsto:

$list = array('string1', 'string2', 'string3');
echo "Key = ".array_search('string1', $list);
echo " Key = ".array_search('string2', $list);
echo " Key = ".array_search('string3', $list);

O per l'indice, potresti usare

$list = array('string1', 'string2', 'string3');
echo "Index = ".array_search('string1', array_merge($list));
echo " Index = ".array_search('string2', array_merge($list));
echo " Index = ".array_search('string3', array_merge($list));

0
$find="Topsite";
$list=array("Tope","Ajayi","Topsite","Infotech");
$list_count=count($list);
sort($list);
for($i=0;$i<$list_count;$i++)
{
    if($list[$i]==$find){
         $position=$i;
    }

}
echo $position;

-1

Ecco una funzione che funzionerà per indici numerici o di stringa. Passa l'array come primo parametro, quindi l'indice all'elemento che deve essere spostato e infine imposta la direzione su -1 per spostare l'elemento su e su 1 per spostarlo verso il basso. Esempio: Move (['first' => 'Peter', 'second' => 'Paul', 'third' => 'Kate'], 'second', - 1) sposterà Paul su e Peter giù.

function Move($a,$element,$direction)
{

$temp = [];
$index = 0;

foreach($a as $key=>$value)
{
    $temp[$index++] = $key;
}

$index = array_search($element,$temp);

$newpos = $index+$direction;

if(isset($temp[$newpos]))
{
        $value2 = $temp[$newpos];
        $temp[$newpos]=$element;
        $temp[$index]=$value2;
}
else
{
    # move is not possible
    return $a; # returns the array unchanged
}   

$final = [];

foreach($temp as $next)
{
    $final[$next]=$a[$next];
}

return $final;

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.