다차원 배열의 하위 배열에 있는 특정 키에 특정 값이 있는지 확인합니다.
인덱스된 하위 배열에서 특정 값을 찾기 위해 다차원 배열을 검색해야 합니다.
즉, 다차원 배열의 단일 열에서 값을 확인해야 합니다.값이 다차원 배열의 어딘가에 존재한다면 반환하고 싶습니다.true
그렇지않으면false
$my_array = array(
0 => array(
"name" => "john",
"id" => 4
),
1 => array(
"name" => "mark",
"id" => 152
),
2 => array(
"name" => "Eduard",
"id" => 152
)
);
가장 빠르고 효율적인 방법으로 어레이를 확인할 수 있는지 알고 싶습니다.$my_array
에는, 키 「id」의 값이 포함되어 있습니다.예를 들어,id => 152
다차원 배열의 어느 곳에서도true
.
단순한 루프보다 빠른 것은 없습니다.이를 위해 일부 어레이 기능을 혼합하여 조합할 수 있지만, 이러한 기능은 루프로 구현될 뿐입니다.
function whatever($array, $key, $val) {
foreach ($array as $item)
if (isset($item[$key]) && $item[$key] == $val)
return true;
return false;
}
** PHP > = 5.5
간단히 이것을 사용할 수 있다.
$key = array_search(40489, array_column($userdb, 'uid'));
이 다차원 배열을 가정해 보겠습니다.
$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'));
가장 간단한 방법은 다음과 같습니다.
$my_array = array(
0 => array(
"name" => "john",
"id" => 4
),
1 => array(
"name" => "mark",
"id" => 152
),
2 => array(
"name" => "Eduard",
"id" => 152
)
);
if (array_search(152, array_column($my_array, 'id')) !== FALSE) {
echo 'FOUND!';
} else {
echo 'NOT FOUND!';
}
다음은 Dan Grossman의 답변의 최신 버전입니다.다차원 어레이(내가 찾고 있던 것)에 대응합니다.
function find_key_value($array, $key, $val)
{
foreach ($array as $item)
{
if (is_array($item) && find_key_value($item, $key, $val)) return true;
if (isset($item[$key]) && $item[$key] == $val) return true;
}
return false;
}
"id" 조회를 많이 해야 하는 경우 모든 "id"를 포함하는 두 번째 어레이를 키로 사용해야 합니다.
$lookup_array=array();
foreach($my_array as $arr){
$lookup_array[$arr['id']]=1;
}
이제 기존 ID를 매우 빠르게 확인할 수 있습니다. 예를 들어 다음과 같습니다.
echo (isset($lookup_array[152]))?'yes':'no';
적절한 솔루션은 다음과 같은 방법으로 제공할 수 있습니다.@Elias Van Ootegan
코멘트에서 다음과 같습니다.
$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";
나도 노력했고 날 위해 일했어 고마워, 친구.
편집필
주의: PHP 5.5+로 동작합니다.
TMTOWTDI. 다음은 복잡한 순서대로 몇 가지 해결 방법입니다.
(복잡성에 대한 간단한 입문서는 다음과 같습니다.)O(n)
또는 "big o"는 최악의 경우를 의미합니다.n
배열 내의 요소 수를 의미합니다.o(n)
또는 "little o"는 최상의 경우 시나리오를 의미합니다.간단히 말하면, 최악의 시나리오에 대해 걱정만 하면 됩니다.n ^ 2
또는n!
이는 컴퓨팅 시간의 변화를 나타내는 척도에 가깝습니다.n
전체 컴퓨팅 시간보다 증가합니다.위키피디아는 시간 계산의 복잡성에 대한 좋은 기사를 가지고 있다.
경험에서 배운 것이 있다면, 프로그램의 littleo를 최적화하는 데 너무 많은 시간을 소비하는 것은 분명 시간을 낭비하는 것이다.
솔루션 0:O(n) / o(1)
복잡성:
이 솔루션에는 루프를 통해 1회 비교 - 1회 반복하는 최적의 시나리오가 있지만 일치하는 값이 어레이의 위치0에 있는 경우만 있습니다.최악의 경우 어레이에 존재하지 않기 때문에 어레이의 모든 요소에 대해 반복해야 합니다.
foreach ($my_array as $sub_array) {
if (@$sub_array['id'] === 152) {
return true;
}
}
return false;
1: 결 1 1 1:O(n) / o(n)
★★★★★★★★★★★★★★★★★★:
있든 이 이이 no no no this this가 됩니다.따라서 이 솔루션은 항상n
어레이를 반복합니다.
return 0 < count(
array_filter(
$my_array,
function ($a) {
return array_key_exists('id', $a) && $a['id'] == 152;
}
)
);
2: 결 2 2 2:O(n log n) / o(n log n)
★★★★★★★★★★★★★★★★★★:
은 " " " 입니다.log n
n
삽입 = "삽입" = "삽입"n * log n
에는 해시 또 다른 해시 조회가 있습니다.log n
그게 이산 수학의 원리이기 때문에 포함되지 않습니다.
$existence_hash = [];
foreach ($my_array as $sub_array) {
$existence_hash[$sub_array['id']] = true;
}
return @$existence_hash['152'];
같은 일을 하려고 이 투고를 접하게 되어, 이 페이지의 장래의 방문자에게 제안하고 싶은 독자적인 솔루션을 생각해 냈습니다(또, 이 방법으로 예기치 않은 문제가 발생하지 않는지를 확인했습니다).
심플한 것을 원하신다면true
★★★★★★★★★★★★★★★★★」false
한 이 할 수 한 후 "Serialize"를 사용할 수중에 "Serialize"를 사용할 수 있습니다.배열을 시리얼화한 후 사용할 수 있습니다.stripos
을을검검검 :
stripos(serialize($my_array),$needle)
나한테는 효과가 있는 것 같아.
질문하신 것처럼 심플한 2-D 어레이가 더 좋지 않을까요?보세요.
2-D 어레이 이름 $my_array와 검색 값이 $id라고 가정합니다.
function idExists($needle='', $haystack=array()){
//now go through each internal array
foreach ($haystack as $item) {
if ($item['id']===$needle) {
return true;
}
}
return false;
}
그리고 그것을 부르는 것은:
idExists($id, $my_array);
보시는 바와 같이 실제로는 key_name 'id'만을 가진 내부 인덱스가 $value를 가지고 있는지 여부만 확인합니다.key_name 'name'에도 $value가 있는 경우 여기에 있는 다른 답변도 true가 될 수 있습니다.
2개의 파라미터만으로 사용할 수 있습니다.
function whatever($array, $val) {
foreach ($array as $item)
if (isset($item) && in_array($val,$item))
return 1;
return 0;
}
이 방법이 퍼포먼스에 더 좋은지 나쁜지는 모르겠지만, 다른 방법이 있습니다.
$keys = array_map(function($element){return $element['id'];}, $my_array);
$flipped_keys = array_flip($keys);
if(isset($flipped_keys[40489]))
{
// true
}
different between isset vs array_key_exits isset()과 array_key_exists()의 차이점은 무엇입니까?
== 대 === PHP 등식(== 이중 등식)과 아이덴티티(=== 삼중 등식) 비교 연산자는 어떻게 다릅니까?
function specificValue(array $array,$key,$val) {
foreach ($array as $item)
if (array_key_exits($item[$key]) && $item[$key] === $val)
return true;
return false;
}
아래의 코드로 시험해 보세요.모든 종류의 다차원 배열 검색에서 정상적으로 작동합니다.
function multi_array_search($search_for, $search_in) {
foreach ($search_in as $element) {
if ( ($element === $search_for) ){
return true;
}elseif(is_array($element)){
$result = multi_array_search($search_for, $element);
if($result == true)
return true;
}
}
return false;
}
function checkMultiArrayValue($array) {
global $test;
foreach ($array as $key => $item) {
if(!empty($item) && is_array($item)) {
checkMultiArrayValue($item);
}else {
if($item)
$test[$key] = $item;
}
}
return $test;
}
$multiArray = array(
0 => array(
"country" => "",
"price" => 4,
"discount-price" => 0,
),);
$test = checkMultiArrayValue($multiArray);
echo "<pre>"
print_r($test);
인덱스 및 값이 있는 어레이를 반환합니다.
다차원 배열에 일부 값이 포함되어 있는지 여부를 판단하기 위해 다음과 같은 함수를 작성했습니다.
function findKeyValue ($array, $needle, $value, $found = false){
foreach ($array as $key => $item){
// Navigate through the array completely.
if (is_array($item)){
$found = $this->findKeyValue($item, $needle, $value, $found);
}
// If the item is a node, verify if the value of the node contains
// the given search parameter. E.G.: 'value' <=> 'This contains the value'
if ( ! empty($key) && $key == $needle && strpos($item, $value) !== false){
return true;
}
}
return $found;
}
함수를 다음과 같이 호출합니다.
$this->findKeyValue($array, $key, $value);
언급URL : https://stackoverflow.com/questions/6990855/check-if-a-specific-value-exists-at-a-specific-key-in-any-subarray-of-a-multidim
'programing' 카테고리의 다른 글
@InjectMocks 클래스의 메서드를 조롱하려면 어떻게 해야 합니까? (0) | 2022.11.24 |
---|---|
PHP로 1일 빼기 (0) | 2022.11.24 |
com.jcraft.jsch를 클릭합니다.JSch Exception:알 수 없는 호스트 키 (0) | 2022.11.24 |
MariaDB Connector/J를 사용하여 MySQL에 SSL 연결을 설정하는 방법 (0) | 2022.11.06 |
XAMPP InnoDB에서 MySQL을 시작할 때 오류 발생 (0) | 2022.11.06 |