이 다차원 배열이 있습니다. 나는 그것을 검색하고 “슬러그”의 값과 일치하는 키만 반환해야합니다. 다차원 배열 검색에 대한 다른 스레드가 있다는 것을 알고 있지만 내 상황에 적용 할만큼 충분히 이해하지 못하고 있습니다. 도움을 주셔서 대단히 감사합니다!
그래서 다음과 같은 기능이 필요합니다.
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' => '',
),
);
답변
매우 간단합니다.
function myfunction($products, $field, $value)
{
foreach($products as $key => $product)
{
if ( $product[$field] === $value )
return $key;
}
return false;
}
답변
또 다른 poossible 솔루션은 array_search()
함수를 기반으로합니다 . 당신은 PHP 5.5.0 사용할 필요 이상.
예
$userdb=Array
(
(0) => Array
(
(uid) => '100',
(name) => '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이 필요했습니다.
이전에 말했듯이이 크기의 배열을 사용하는 응용 프로그램에서는 두 시간이 상당히 허용됩니다. 크기가 많이 커지면 1M 요소라고 가정하면이 작은 차이도 증가합니다.
업데이트 II
array_walk_recursive
여기에 일부 답변에 대한 언급이 있었던 방법에 대한 테스트를 추가했습니다 . 얻은 결과는 올바른 것입니다. 그리고 우리가 성능에 초점을 맞추면 테스트에서 조사한 다른 것보다 약간 나쁩니다 . 테스트에서 .NET 기반 방법보다 약 10 배 느린 것을 확인할 수 있습니다 array_search
. 다시 말하지만, 이것은 대부분의 응용 프로그램에서 그다지 적절한 차이가 아닙니다.
업데이트 III
이 방법에 대한 몇 가지 제한 사항을 발견 한 @mickmackusa에게 감사드립니다.
- 이 방법은 연관 키에서 실패합니다.
- 이 메서드는 인덱스 된 하위 배열에서만 작동합니다 (0부터 시작하고 연속적으로 오름차순 키를 가짐).
답변
이 클래스 메서드는 여러 조건으로 배열에서 검색 할 수 있습니다.
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;
}
답변
다음 방문자를 위해 : 재귀 배열 워크를 사용하십시오. 다차원 배열의 모든 “잎”을 방문합니다. 영감을 얻으려면 :
function getMDArrayValueByKey($a, $k) {
$r = [];
array_walk_recursive ($a,
function ($item, $key) use ($k, &$r) {if ($key == $k) $r[] = $item;}
);
return $r;
}
답변
나는 $products
맨 처음에 문제에 주어진 실제 배열이 어디에 있습니까 ?
print_r(
array_search("breville-variable-temperature-kettle-BKE820XL",
array_map(function($product){return $product["slug"];},$products))
);
