이 다차원 배열이 있습니다.검색하여 “slug” 값과 일치하는 키만 반환해야 합니다.다차원 어레이 검색에는 다른 스레드가 있지만, 제 상황에 적용할 수 있을 만큼 잘 이해하지 못합니다.도와주셔서 정말 감사합니다!
그래서 다음과 같은 기능이 필요합니다.
myfunction($products,'breville-one-touch-tea-maker-BTM800XL'); // returns 1
어레이는 다음과 같습니다.
$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'
=> '',
), );
질문에 대한 답변
또 하나의 실현 가능한 솔루션은array_search()
기능.PHP 5.5.0 이상을 사용해야 합니다.
예
$userdb=Array (0) => 어레이 (uid) => ‘100’, (이름) => ‘Sandra Shush’, (url) => ‘urlof100’ ,(1) => Array
(
(uid) => '5465',
(name) => 'Stefanie Mcmohn',
(pic_square) => 'urlof100'
),
(2) => Array
(
(uid) => '40489',
(name) => 'Michael',
(pic_square) => 'urlof40489'
) );
$key = array_search(40489, array_column($userdb, 'uid'));
echo ("The key is: ".$key); //This will output- The key is: 2
설명.
함수 ‘array_search()’에는 두 개의 인수가 있습니다.첫 번째 값은 검색할 값입니다.두 번째는 함수가 검색해야 하는 위치입니다.함수 ‘array_column()’은 키가 ‘uid’인 요소의 값을 가져옵니다.요약
따라서 다음과 같이 사용할 수 있습니다.array_search('breville-one-touch-tea-maker-BTM800XL', array_column($products, 'slug'));
또는 원하는 경우:
// define function function array_search_multidim($array, $column, $key){
return (array_search($key, array_column($array, $column))); }
// use it array_search_multidim($products, 'slug', 'breville-one-touch-tea-maker-BTM800XL');
원본 예(xfoxawy 기준)는 DOCS에서 찾을 수 있습니다.
그array_column()
페이지를 엽니다.
갱신하다
Vael의 코멘트로 인해 궁금해서 간단한 테스트를 만들어 사용 방법을 확인했습니다.array_search
그리고 수용된 답변에 제시된 방법.
1000개의 어레이를 포함하는 어레이를 작성했습니다.구조는 다음과 같습니다(모든 데이터는 랜덤화되었습니다).
[
{
"_id": "57fe684fb22a07039b3f196c",
"index": 0,
"guid": "98dd3515-3f1e-4b89-8bb9-103b0d67e613",
"isActive": true,
"balance": "$2,372.04",
"picture": "http://placehold.it/32x32",
"age": 21,
"eyeColor": "blue",
"name": "Green",
"company": "MIXERS"
},... ]
이름 필드의 다른 값을 검색하여 검색 테스트를 100회 실행한 후 평균 시간을 밀리초 단위로 계산했습니다.여기서 예를 볼 수 있습니다.
그 결과 이 답변에 제안된 방법은 값을 구하는 데 약 2E-7이 필요했고, 수용된 답변 방법은 약 8E-7이 필요했다.
앞서 말씀드린 바와 같이 이 크기의 어레이를 사용하는 애플리케이션에서는 두 번 모두 매우 민감합니다.사이즈가 많이 커지면, 예를 들어 100만 요소라고 하면, 이 작은 차이도 커집니다.
업데이트 II
에 기반한 메서드에 대한 테스트를 추가했습니다.array_walk_recursive
여기 몇 가지 답변에 언급되어 있습니다.결과는 정확합니다.그리고 퍼포먼스에 초점을 맞추면 다른 사람들이 테스트한 것보다 조금 더 나빠요.이 테스트에서는 다음 테스트에 기초한 방법보다 10배 정도 느리다는 것을 알 수 있습니다.array_search
이 점은 대부분의 어플리케이션에서 그다지 관련이 없는 차이입니다.
갱신 III
@mickmackusa가 이 방법의 몇 가지 제한을 발견해 준 덕분입니다.
- 이 메서드는 관련 키에서 실패합니다.
- 이 메서드는 인덱스된 서브어레이에서만 작동합니다(0부터 시작하여 연속적으로 오름차순 키를 사용).
업데이트 III에 관한 주의사항
- 퍼포먼스는 고려하지 않습니다.array_keys & array_column과 함께 array_column을 사용하면 다음과 같은1줄로 이 제한을 극복할 수 있습니다.
$product_search_index =
array_search( 'breville-one-touch-tea-maker-BTM800XL', array_filter( array_combine( array_keys($products), array_column( $products, 'slug' ) ) ) );
매우 심플:
function myfunction($products, $field, $value) {
foreach($products as $key => $product)
{
if ( $product[$field] === $value )
return $key;
}
return false; }
이 클래스 메서드는 여러 조건으로 배열에서 검색할 수 있습니다.
class Stdlib_Array {
public static function multiSearch(array $array, array $pairs)
{
$found = array();
foreach ($array as $aKey => $aVal) {
$coincidences = 0;
foreach ($pairs as $pKey => $pVal) {
if (array_key_exists($pKey, $aVal) && $aVal[$pKey] == $pVal) {
$coincidences++;
}
}
if ($coincidences == count($pairs)) {
$found[$aKey] = $aVal;
}
}
return $found;
}
}
// Example:
$data = array(
array('foo' => 'test4', 'bar' => 'baz'),
array('foo' => 'test',
'bar' => 'baz'),
array('foo' => 'test1', 'bar' => 'baz3'),
array('foo' => 'test',
'bar' => 'baz'),
array('foo' => 'test',
'bar' => 'baz4'),
array('foo' => 'test4', 'bar' => 'baz1'),
array('foo' => 'test',
'bar' => 'baz1'),
array('foo' => 'test3', 'bar' => 'baz2'),
array('foo' => 'test',
'bar' => 'baz'),
array('foo' => 'test',
'bar' => 'baz'),
array('foo' => 'test4', 'bar' => 'baz1') );
$result = Stdlib_Array::multiSearch($data, array('foo' => 'test4', 'bar' => 'baz1'));
var_dump($result);
작성 예정:
array(2) {
[5]=>
array(2) {
["foo"]=>
string(5) "test4"
["bar"]=>
string(4) "baz1"
}
[10]=>
array(2) {
["foo"]=>
string(5) "test4"
["bar"]=>
string(4) "baz1"
} }
다음 기능을 사용합니다.
function searchThroughArray($search,array $lists){
try{
foreach ($lists as $key => $value) {
if(is_array($value)){
array_walk_recursive($value, function($v, $k) use($search ,$key,$value,&$val){
if(strpos($v, $search) !== false )
$val[$key]=$value;
});
}else{
if(strpos($value, $search) !== false )
$val[$key]=$value;
}
}
return $val;
}catch (Exception $e) {
return false;
}
}
기능을 호출합니다.
print_r(searchThroughArray('breville-one-touch-tea-maker-BTM800XL',$products));
function search($array, $key, $value)
{
$results = array();
if (is_array($array))
{
if (isset($array[$key]) && $array[$key] == $value)
$results[] = $array;
foreach ($array as $subarray)
$results = array_merge($results, search($subarray, $key, $value));
}
return $results;
}