Eu tenho esta matriz multidimensional. Preciso pesquisar e retornar apenas a chave que corresponda ao valor do "slug". Eu sei que existem outros tópicos sobre a busca de matrizes multidimensionais, mas não estou realmente entendendo o suficiente para aplicar à minha situação. Muito obrigado por qualquer ajuda!
Portanto, preciso de uma função como:
myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1
Aqui está o Array:
$products = array (
1 => array(
'name' => 'The Breville One-Touch Tea Maker',
'slug' => 'breville-one-touch-tea-maker-BTM800XL',
'shortname' => 'The One-Touch Tea Maker',
'listprice' => '299.99',
'price' => '249.99',
'rating' => '9.5',
'reviews' => '81',
'buyurl' => 'http://www.amazon.com/The-Breville-One-Touch-Tea-Maker/dp/B003LNOPSG',
'videoref1' => 'xNb-FOTJY1c',
'videoref2' => 'WAyk-O2B6F8',
'image' => '812BpgHhjBML.jpg',
'related1' => '2',
'related2' => '3',
'related3' => '4',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => 'K. Martino',
),
2 => array(
'name' => 'Breville Variable-Temperature Kettle BKE820XL',
'slug' => 'breville-variable-temperature-kettle-BKE820XL',
'shortname' => 'Variable Temperature Kettle',
'listprice' => '199.99',
'price' => '129.99',
'rating' => '9',
'reviews' => '78',
'buyurl' => 'http://www.amazon.com/Breville-BKE820XL-Variable-Temperature-1-8-Liter-Kettle/dp/B001DYERBK',
'videoref1' => 'oyZWBD83xeE',
'image' => '41y2B8jSKmwL.jpg',
'related1' => '3',
'related2' => '4',
'related3' => '5',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => '',
),
);
php
search
multidimensional-array
key
Ben Kouba
fonte
fonte
if (myfunction($array, 'field', 'value') !== FALSE )) // do something...
Outra solução possível é baseada na
array_search()
função. Você precisa usar o PHP 5.5.0 ou superior.Exemplo
Explicação
A função
array_search()
possui dois argumentos. O primeiro é o valor que você deseja pesquisar. O segundo é onde a função deve pesquisar. A funçãoarray_column()
obtém os valores dos elementos cuja chave é'uid'
.Resumo
Então você pode usá-lo como:
ou, se preferir:
O exemplo original (por xfoxawy) pode ser encontrado no DOCS .
A
array_column()
página .Atualizar
Devido ao comentário do Vael fiquei curioso, então fiz um teste simples para medir o desempenho do método que utiliza
array_search
e do método proposto na resposta aceita.Eu criei um array que continha 1000 arrays, a estrutura era assim (todos os dados eram randomizados):
Executei o teste de pesquisa 100 vezes procurando por valores diferentes para o campo de nome e, em seguida, calculei o tempo médio em milissegundos . Aqui você pode ver um exemplo.
Os resultados foram que o método proposto nesta resposta precisava de cerca de 2E-7 para encontrar o valor, enquanto o método de resposta aceito precisava de cerca de 8E-7.
Como eu disse antes, ambas as vezes são bastante aceitáveis para um aplicativo que usa um array com este tamanho. Se o tamanho aumentar muito, digamos 1M de elementos, essa pequena diferença também aumentará.
Atualização II
Eu adicionei um teste para o método baseado no
array_walk_recursive
qual foi mencionado em algumas das respostas aqui. O resultado obtido é o correto. E se nos concentrarmos no desempenho, é um pouco pior do que os outros examinados no teste . No teste, você pode ver que é cerca de 10 vezes mais lento do que o método baseado emarray_search
. Novamente, essa não é uma diferença muito relevante para a maioria dos aplicativos.Atualização III
Agradecimentos a @mickmackusa por detectar várias limitações neste método:
fonte
array_search()
comarray_column()
não funcionará no array de amostra do OP porque as chaves do subarray começam em1
. Este método também falhará em chaves associativas. Este método só funcionará em submatrizes indexados (começando0
e tendo chaves ascendentes consecutivas). A razão para isso é porquearray_column()
irá gerar novos índices em sua matriz retornada.Este método de classe pode pesquisar na matriz por várias condições:
Vai produzir:
fonte
Use esta função:
e função de chamada.
fonte
fonte
Para o próximo visitante que chegar: use a caminhada de array recursiva; ele visita cada "folha" no array multidimensional. Aqui está a inspiração:
fonte
Eu gostaria de fazer o seguinte, onde
$products
está a matriz real fornecida no problema no início.fonte
Tente isto
fonte
&&
e em||
vez deAND
eOR
na sua condição. Não há razão para declararcurrent_key
. A comparação$needle
deve ser estrita.