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?


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.


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

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?


"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

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

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?


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

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


0

Experimente a função array_keys do PHP.

$key_string1 = array_keys($list, 'string1');

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

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;

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

}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.