Tengo una matriz:
$list = array('string1', 'string2', 'string3');
Quiero obtener el índice para un valor dado (es decir, 1
para string2
y 2
para 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?
Respuestas:
array_search
es la forma de hacerlo.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.
fuente
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, "
fuente
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 utilizandoarray_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?fuente
// 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
fuente
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));
fuente
¿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?
fuente
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));
fuente
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
fuente
Prueba la función PHP array_keys.
$key_string1 = array_keys($list, 'string1');
fuente
array_keys
es diferente aarray_search
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));
fuente
$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;
fuente
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;
}
fuente