Como posso encontrar a chave da última ocorrência de um item em uma multidimensional array?

Eu preciso encontrar a chave que corresponde à última ocorrência de (id = 100001203541047) na seguinte matriz:

[0] => Array ( [id] => 10152583762905798_10152583800415798 [from] => Array ( [id] => 100001203541047 [name] => Gangareddy Chealimealla ) [message] => Desi Flipkart [created_time] => 2014-07-30T07:30:34+0000 [like_count] => 0 [user_likes] => [can_comment] => 1 ) [1] => Array ( [id] => 10152583762905798_10152583786375798 [from] => Array ( [id] => 100001430479186 [name] => Pratik Das ) [message] => flipkart rules! (y) [created_time] => 2014-07-30T07:16:56+0000 [like_count] => 0 [user_likes] => [can_comment] => 1 ) [2] => Array ( [id] => 10152583762905798_10152583802415798 [from] => Array ( [id] => 100001203541047 [name] => Gangareddy Chealimealla ) [message] => Desi Flipkart [created_time] => 2014-07-30T08:30:34+0000 [like_count] => 0 [user_likes] => [can_comment] => 1 ) 

Eu tentei o seguinte código, mas está retornando duas posições.

  foreach($arr as $key => $array) { if ( $array['from']['id'] === $id) echo $key."\n\n"; } } 

Por que isso não mostra o último?

O código que você já escreveu quase funciona. O problema é que ele imediatamente imprimirá a chave cada vez que encontrar uma que corresponda ao id durante o loop foreach.

 foreach($arr as $key => $array) { if ( $array['from']['id'] === $id) { echo $key."\n\n"; } } 

Se em vez disso você armazena a chave em uma variável, então, após o término do ciclo, o valor na variável será o último, e você pode apenas imprimir isso.

 $last = ""; foreach($arr as $key => $array) { if ( $array['from']['id'] === $id) { $last = $key; } } echo $last."\n\n"; 

Para fazê-lo de forma simples, você pode armazená-los em uma matriz e depois do loop, pegue o último.

mudança

 echo $key."\n\n"; 

para

 $ids[] = $key 

E após o loop, você terá sua última ocorrência em

 end($ids); 

Espero que ajude você.

 // function where you can pass the id you are looking for, eg.: 100001203541047. function findElementById($id, $arr) { // iterate from the back, and you get the last match. for ($i = count($arr) - 1; $i >= 0; $i--) { $array = $arr[$i]; if($array['from']['id'] === $id)){ return $array; // if you find the element return it. } } return null; // return null if not found. } 

Exemplo de uso:

 $elementYouAreLookingFor = findElementById(100001203541047, $arr); 

Supondo que a matriz já esteja ordenada, você pode usar o array_map para encontrar aqueles que contêm sua variável de pesquisa e, em seguida, use o array_pop para obter o último resultado.

Por exemplo: esta function apenas retorna o último valor da matriz com o ID mágico.

 $magicID = '100001203541047'; function findSame($value){ if($value['from']['id'] == $magicID){ return $value; } } // $values should contain your data $values = array(array(1,'from'=>array('id'=>'100001203541047'),3), array(1,'from'=>array('id'=>'20000'),4), array(2,'from'=>array('id'=>'100001203541047'),3)); $mapping = array_pop(array_filter(array_map('findSame', $values))); var_dump($mapping); 

Aqui é divertido (PHP> = 5.5.0):

 echo array_search($id, array_reverse(array_column(array_column($array, 'from'), 'id'), true));