Obtener el valor de índice de una matriz en PHP

86

Tengo una matriz:

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

Quiero obtener el índice para un valor dado (es decir, 1para string2y 2para string3)

Todo lo que quiero es la posición de las cadenas en la matriz.

  • cadena1 es 0
  • string2 es 1
  • string3 es 2

¿Cómo lograrlo?

Aakash Chakravarthy
fuente
7
Un amigo mío escritor de tecnología me dijo: "no se pueden obtener las respuestas correctas a menos que se hagan las preguntas correctas".
Bill Karwin
esto es antiguo ... pero me gustaría saber por qué: "Intenté array_search pero no sirvió de nada"
dsdsdsdsd
Por favor, marque la respuesta más alta como aceptada.
Robsch
Si tiene una matriz asociativa, como yo, esta respuesta ayuda: stackoverflow.com/a/3365793/470749
Ryan

Respuestas:

157

array_search es la forma de hacerlo.

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

De los documentos :

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

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

Puede recorrer la matriz manualmente y encontrar el índice, pero ¿por qué hacerlo cuando hay una función para eso? Esta función siempre devuelve una clave y funcionará bien con matrices asociativas y normales.

RaYell
fuente
10
Esto devuelve la clave, no el índice. En su ejemplo, la clave es convenientemente el índice del valor.
Jorge Ferreira
1
@smink, la matriz de OP es una matriz no asociativa, por lo que funciona bien.
Matthew Flaschen
lo siento, no especifiqué el tipo de matriz. La matriz que uso es una matriz multidimensional, consulte mi respuesta para la solución
Aakash Chakravarthy
Tengo este tipo de matriz: [0 => {id: 1, nombre: algo}, 1 => {.....}, ...]. ¿Es posible encontrar una clave / índice como array_search ("nombre" => algo, $ matriz)?
lazzy_ms
¿Qué tal si la matriz tiene un hijo?
zukijuki
19

Si solo está haciendo algunos de ellos (y / o el tamaño de la matriz es grande), entonces estaba en el camino correcto con array_search:

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

Si quieres todos (o muchos de ellos), un bucle probablemente te hará mejor:

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "
ircmaxell
fuente
1
el foreach es lo que necesitaba
zzapper
11

Otras personas han sugerido array_search()cuál da la clave del elemento de matriz donde se encuentra el valor. Puede asegurarse de que las claves de la matriz sean números enteros contiguos utilizando array_values():

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

// result: 1

Dijiste en tu pregunta que eso array_search()era inútil. ¿Puedes explicar porque? ¿Qué probó y cómo no satisfizo sus necesidades?

Bill Karwin
fuente
"array_values ​​() no sirvió de nada" .. debería ser "array_search () no sirvió de nada"
Vex
7

// o considerando la estructura de su matriz:

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

// podrías simplemente

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

// ejecutado

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

// alternativamente

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

// recursivamente

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

// salidas

//-- 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
fuente
6

El problema es que no tiene un índice numérico en su matriz.
El uso de array_values ​​() creará una matriz indexada cero que luego puede buscar usando array_search () sin pasar por la necesidad de usar un bucle for.

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));
Brian Berneker
fuente
este es hasta ahora el método más corto y trabajado para la pregunta,
Toni Tegar Sahidi
1

¿Podrías ser un poco más específico?

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

funciona bien para mí. ¿Estás tratando de lograr algo más complejo?

Jeff
fuente
1

Este código debería hacer lo mismo que su nueva rutina, trabajando con la matriz multidimensional correcta.

 $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));
Vejar
fuente
1
La pregunta no menciona nada sobre matrices multidimensionales (los comentarios del OP en otras respuestas sugieren que esta respuesta es lo que realmente estaba buscando, pero si solo lee la pregunta original y esta respuesta, lo que está diciendo no tiene sentido)
StubbornShowaGuy
1

Tendrá que crear una función para esto. No creo que haya ninguna función incorporada para ese propósito. Todas las matrices PHP son asociativas de forma predeterminada. Entonces, si no está seguro acerca de sus claves, aquí está el código:

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

Prueba la función PHP array_keys.

$key_string1 = array_keys($list, 'string1');
Evernoob
fuente
¿No se invierten esos parámetros ?
ashleedawg
@ashleedawg No, has leído mal, array_keyses diferente aarray_search
Un amigo
0

array_search debería funcionar bien, solo probé esto y devuelve las claves como se esperaba:

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

O para el índice, puede usar

$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));
Vejar
fuente
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
fuente
-1

Aquí hay una función que funcionará para índices numéricos o de cadena. Pase la matriz como primer parámetro, luego el índice al elemento que necesita moverse y finalmente establezca la dirección en -1 para mover el elemento hacia arriba y en 1 para moverlo hacia abajo. Ejemplo: Move (['first' => 'Peter', 'second' => 'Paul', 'third' => 'Kate'], 'second', - 1) moverá a Paul hacia arriba y Peter hacia abajo.

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
fuente