Ruft den Indexwert eines Arrays in PHP ab

85

Ich habe ein Array:

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

Ich möchte den Index für einen bestimmten Wert erhalten (dh 1für string2und 2für string3)

Ich möchte nur die Position der Zeichenfolgen im Array

  • string1 ist 0
  • string2 ist 1
  • string3 ist 2

Wie erreicht man das?

Aakash Chakravarthy
quelle
7
Ein Freund eines technischen Schriftstellers sagte mir: "Sie können nicht die richtigen Antworten bekommen, wenn Sie nicht die richtigen Fragen stellen."
Bill Karwin
das ist alt .... aber ich würde gerne wissen warum: "Ich habe array_search ausprobiert, aber es hat keinen
Sinn gemacht
Bitte markieren Sie die höher bewertete Antwort als akzeptiert.
Robsch
Wenn Sie wie ich ein assoziatives Array haben, hilft diese Antwort: stackoverflow.com/a/3365793/470749
Ryan

Antworten:

156

array_search ist der Weg, es zu tun.

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

Aus den Dokumenten :

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

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

Sie könnten das Array manuell durchlaufen und den Index finden, aber warum, wenn es eine Funktion dafür gibt? Diese Funktion gibt immer einen Schlüssel zurück und funktioniert gut mit assoziativen und normalen Arrays.

RaYell
quelle
10
Dies gibt den Schlüssel zurück, nicht den Index. In Ihrem Beispiel ist der Schlüssel bequemerweise der Index des Wertes.
Jorge Ferreira
1
@smink, das Array des OP ist ein nicht assoziatives Array, daher funktioniert es einwandfrei.
Matthew Flaschen
Entschuldigung, ich habe den Typ des Arrays nicht angegeben. Das Array, das ich benutze, ist ein mehrdimensionales Array. Bitte lesen Sie meine Antwort für die Lösung
Aakash Chakravarthy
Ich habe diese Art von Array: [0 => {ID: 1, Name: etwas}, 1 => {.....}, ...]. Ist es möglich, Schlüssel / Index wie array_search ("name" => etwas, $ array) zu finden?
Lazy_ms
Wie wäre es, wenn das Array ein Kind hat?
Zukijuki
19

Wenn Sie nur einige davon ausführen (und / oder das Array groß ist), waren Sie mit array_search auf dem richtigen Weg:

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

Wenn Sie alle (oder viele von ihnen) wollen, wird eine Schleife Sie wahrscheinlich besser machen:

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "
ircmaxell
quelle
1
Das Foreach ist das, was ich brauchte
Zzapper
11

Andere Leute haben vorgeschlagen array_search(), den Schlüssel des Array-Elements anzugeben, in dem sich der Wert befindet. Sie können sicherstellen, dass die Array-Schlüssel zusammenhängende Ganzzahlen sind, indem Sie Folgendes verwenden array_values():

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

// result: 1

Sie sagten in Ihrer Frage, das array_search()sei sinnlos. Kannst du erklären warum? Was haben Sie versucht und wie hat es Ihre Bedürfnisse nicht erfüllt?

Bill Karwin
quelle
"array_values ​​() war nutzlos" .. sollte sein "array_search () war nutzlos"
Vex
7

// oder unter Berücksichtigung Ihrer Array-Struktur:

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

// du könntest einfach

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

// hingerichtet

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";

// Alternative

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";

// rekursiv

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

// Ausgänge

//-- 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
Michael Hurley
quelle
6

Das Problem ist, dass Sie keinen numerischen Index für Ihr Array haben.
Wenn Sie array_values ​​() verwenden, wird ein Array mit einem Index von Null erstellt, das Sie dann mit array_search () durchsuchen können, ohne dass eine for-Schleife verwendet werden muss.

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));
Brian Berneker
quelle
Dies ist bislang die kürzeste und
am besten
1

Könnten Sie etwas genauer sein?

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

funktioniert gut für mich. Versuchen Sie etwas Komplexeres zu erreichen?

Jeff
quelle
1

Dieser Code sollte mit Ihrer neuen Routine identisch sein und mit dem richtigen mehrdimensionalen Array arbeiten.

 $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));
Ärgern
quelle
1
Die Frage erwähnt nichts über mehrdimensionale Arrays (Kommentare des OP in anderen Antworten legen nahe, dass diese Antwort das ist, wonach er tatsächlich gesucht hat, aber wenn Sie nur die ursprüngliche Frage und diese Antwort lesen, macht das, was Sie sagen, keinen Sinn).
StubbornShowaGuy
1

Sie müssen hierfür eine Funktion erstellen. Ich glaube nicht, dass es zu diesem Zweck eine eingebaute Funktion gibt. Alle PHP-Arrays sind standardmäßig assoziativ. Wenn Sie sich bei den Schlüsseln nicht sicher sind, finden Sie hier den Code:

<?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

Krish PG
quelle
0

Probieren Sie die PHP-Funktion array_keys aus.

$key_string1 = array_keys($list, 'string1');
Evernoob
quelle
Sind diese Parameter nicht umgekehrt ?
Ashleedawg
@ashleedawg Nein, Sie haben falsch verstanden, array_keysist anders alsarray_search
Ein Freund
0

array_search sollte einwandfrei funktionieren, hat dies nur getestet und gibt die Schlüssel wie erwartet zurück:

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

Oder für den Index könnten Sie verwenden

$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));
Ärgern
quelle
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;
Ajayi Temitope
quelle
-1

Hier ist eine Funktion, die für numerische oder String-Indizes funktioniert. Übergeben Sie das Array als ersten Parameter und dann den Index an das Element, das verschoben werden muss, und setzen Sie schließlich die Richtung auf -1, um das Element nach oben und 1 zu verschieben, um es nach unten zu verschieben. Beispiel: Verschieben (['erster' => 'Peter', 'zweiter' => 'Paul', 'dritter' => 'Kate'], 'zweiter', - 1) bewegt Paul nach oben und Peter nach unten.

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;

}}

JG Estiot
quelle