Obtenha o valor do índice de uma matriz em PHP

86

Eu tenho uma matriz:

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

Quero obter o índice de um determinado valor (ou seja, 1para string2e 2para string3)

Tudo que eu quero é a posição das cordas na matriz

  • string1 é 0
  • string2 é 1
  • string3 é 2

Como fazer isso?

Aakash Chakravarthy
fonte
7
Um escritor de tecnologia amigo meu me disse: "você não pode obter as respostas certas a menos que faça as perguntas certas."
Bill Karwin
isso é antigo ... mas gostaria de saber por quê: "Eu tentei array_search, mas não
adiantou
Por favor, marque a resposta com melhor classificação como aceita.
robsch
Se você tem uma matriz associativa, como eu, esta resposta ajuda: stackoverflow.com/a/3365793/470749
Ryan

Respostas:

157

array_search é a maneira de fazer isso.

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

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.

RaYell
fonte
10
Isso retorna a chave, não o índice. No seu exemplo, a chave é convenientemente o índice do valor.
Jorge Ferreira
1
@smink, o array do OP é um array não associativo, então funciona bem.
Matthew Flaschen
desculpe, eu não especifiquei o tipo de array. A matriz que uso é uma matriz multidimensional, por favor, veja minha resposta para a solução
Aakash Chakravarthy
Eu tenho este tipo de matriz: [0 => {id: 1, nome: algo}, 1 => {.....}, ...]. isso é possível encontrar chave / índice como array_search ("nome" => algo, $ array)?
lazzy_ms
Que tal se a matriz tiver filho?
zukijuki
19

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, "
ircmaxell
fonte
1
o foreach é o que eu precisava
zzapper
11

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

Bill Karwin
fonte
"array_values ​​() não tinha uso" .. deveria ser "array_search () não tinha uso"
Vex
7

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

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));
Brian Berneker
fonte
este é até agora o método mais curto e trabalhado para a pergunta,
Toni Tegar Sahidi 01 de
1

você poderia ser um pouco mais especifico?

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

funciona bem para mim. Você está tentando realizar algo mais complexo?

Jeff
fonte
1

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));
Vex
fonte
1
A pergunta não menciona nada sobre matrizes multidimensionais (comentários do OP em outras respostas sugerem que esta resposta é o que ele estava realmente procurando, mas se você apenas ler a pergunta original e esta resposta, o que você está dizendo não faz sentido)
StubbornShowaGuy
1

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

Krish PG
fonte
0

Experimente a função array_keys do PHP.

$key_string1 = array_keys($list, 'string1');
Evernoob
fonte
esses parâmetros não estão invertidos ?
ashleedawg
@ashleedawg Não, você leu mal, array_keysé diferente dearray_search
Um amigo de
0

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));
Vex
fonte
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
fonte
-1

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;

}

JG Estiot
fonte