Eu tenho uma matriz:
$list = array('string1', 'string2', 'string3');
Quero obter o índice de um determinado valor (ou seja, 1
para string2
e 2
para string3
)
Tudo que eu quero é a posição das cordas na matriz
- string1 é 0
- string2 é 1
- string3 é 2
Como fazer isso?
Respostas:
array_search
é a maneira de fazer isso.Dos 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;
Você poderia fazer um loop no array manualmente e encontrar o índice, mas por que fazer isso quando há uma função para isso. Esta função sempre retorna uma chave e funcionará bem com matrizes associativas e normais.
fonte
Se você está fazendo apenas alguns deles (e / ou o tamanho do array é grande), então você estava no caminho certo com array_search:
$list = array('string1', 'string2', 'string3'); $k = array_search('string2', $list); //$k = 1;
Se você quiser todos (ou muitos deles), um loop vai te fazer melhor:
foreach ($list as $key => $value) { echo $value . " in " . $key . ", "; } // Prints "string1 in 0, string2 in 1, string3 in 2, "
fonte
Outras pessoas sugeriram
array_search()
que fornece a chave do elemento da matriz onde o valor é encontrado. Você pode garantir que as chaves da matriz sejam inteiros contíguos usandoarray_values()
:$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3'); $index = array_search('string2', array_values($list)); print "$index\n"; // result: 1
Você disse em sua pergunta que
array_search()
não adiantava. Você pode explicar por quê? O que você tentou e como não atendeu às suas necessidades?fonte
// ou considerando sua estrutura de array:
$array = array( 'string1' => array('a' => '', 'b' => '', 'c' => ''), 'string2' => array('a' => '', 'b' => '', 'c' => ''), 'string3' => array('a' => '', 'b' => '', 'c' => ''), );
// você poderia apenas
function findIndexOfKey($key_to_index,$array){ return array_search($key_to_index,array_keys($array)); }
// executado
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"; }
// saídas
//-- 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
fonte
O problema é que você não tem um índice numérico em seu array.
Usar array_values () criará um array indexado por zero que você pode pesquisar usando array_search () ignorando a necessidade de usar um loop for.
$list = array('string1', 'string2', 'string3'); $index = array_search('string2',array_values($list));
fonte
você poderia ser um pouco mais especifico?
$key = array_search('string2',$list)
funciona bem para mim. Você está tentando realizar algo mais complexo?
fonte
Este código deve fazer o mesmo que sua nova rotina, trabalhando com a matriz multidimensional correta.
$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));
fonte
Você terá que criar uma função para isso. Não acho que exista nenhuma função interna para esse propósito. Todos os arrays PHP são associativos por padrão. Portanto, se você não tiver certeza sobre suas chaves, aqui está o 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
fonte
Experimente a função array_keys do PHP.
$key_string1 = array_keys($list, 'string1');
fonte
array_keys
é diferente dearray_search
array_search deve funcionar bem, apenas testei e ele retorna as chaves conforme o esperado:
$list = array('string1', 'string2', 'string3'); echo "Key = ".array_search('string1', $list); echo " Key = ".array_search('string2', $list); echo " Key = ".array_search('string3', $list);
Ou para o índice, você pode 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));
fonte
$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;
fonte
Aqui está uma função que funcionará para índices numéricos ou de string. Passe a matriz como primeiro parâmetro, depois o índice para o elemento que precisa ser movido e, finalmente, defina a direção como -1 para mover o elemento para cima e como 1 para movê-lo para baixo. Exemplo: Move (['primeiro' => 'Pedro', 'segundo' => 'Paulo', 'terceiro' => 'Kate'], 'segundo', - 1) moverá Paulo para cima e Pedro para baixo.
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;
}
fonte