जवाबों:
आप या तो सरणी को पुनरावृत्त करते हैं, विशेष रिकॉर्ड के लिए खोज करते हैं (केवल एक बार में ही खोज करते हैं) या किसी अन्य साहचर्य सरणी का उपयोग करके हैशमैप का निर्माण करते हैं।
पूर्व के लिए, कुछ इस तरह
$item = null;
foreach($array as $struct) {
if ($v == $struct->ID) {
$item = $struct;
break;
}
}
इस सवाल और बाद के जवाबों को बाद में अधिक जानकारी के लिए देखें - कई अनुक्रमित द्वारा संदर्भ PHP सरणी
isset($item)
लेकिन मैं ठीक से चर शुरू करना पसंद करता हूं
if($v == $struct["ID"]){...
YurkamTim सही है। इसे केवल एक संशोधन की आवश्यकता है:
फ़ंक्शन ($) के बाद आपको "उपयोग (और $ searchValue)" द्वारा बाहरी चर के लिए एक संकेतक की आवश्यकता होती है और फिर आप बाहरी चर का उपयोग कर सकते हैं। इसके अलावा आप इसे संशोधित कर सकते हैं।
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
&
जब आयात करने की आवश्यकता नहीं है $searchedValue
बंद दायरे में। इसका &
उपयोग एक संदर्भ बनाने के लिए किया जाता है जो केवल तभी आवश्यक है जब $searchedValue
क्लोजर के अंदर संशोधित किया गया हो।
global
था कि कार्यों में डेटा साझा करना ही एकमात्र प्रयोग था! लेकिन अगर यह वास्तव में धीमा है तो अफ़सोस की बात है। :(
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
मैंने यहां अधिक सुरुचिपूर्ण समाधान पाया है । प्रश्न के अनुकूल होने पर ऐसा लग सकता है:
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
array_filter
एक सरणी लौटाता है, और पहले मूल्य पर नहीं मिलेगा।
$searchedValue
फ़ंक्शन के अंदर पहचान नहीं कर रहा है। लेकिन इसके बाहर है।
$searchedValue
क्लोजर दायरे से बाहर है। दूसरे, आपको कैसे लगता है कि ये ऐरे तरीके काम करते हैं? वे सभी सरणी पर आंतरिक रूप से लूप करते हैं
$searchedValue
जरूरत लिखने के लिए उपयोग करने के लिएfunction ($e) use ($searchedValue) {
यदि आपको कई बार खोजने की आवश्यकता है, तो पुनः अनुक्रमित करने के लिए array_column का उपयोग करने से समय की बचत होगी:
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'
तब आप बस $lookup[$id]
इच्छा कर सकते हैं ।
class ArrayUtils
{
public static function objArraySearch($array, $index, $value)
{
foreach($array as $arrayInf) {
if($arrayInf->{$index} == $value) {
return $arrayInf;
}
}
return null;
}
}
इसका उपयोग करना चाहते हैं जिस तरह से आप कुछ इस तरह होगा:
ArrayUtils::objArraySearch($array,'ID',$v);
प्रयत्न
$entry = current(array_filter($array, function($e) use($v){ return $e->ID==$v; }));
यहाँ काम कर रहे उदाहरण
@YurkaTim की एक छोटी सी गलती को ठीक करते हुए , आपका समाधान मेरे लिए काम करता है use
:
$searchedValue
फ़ंक्शन के अंदर उपयोग करने के लिए , एक समाधान use ($searchedValue)
फ़ंक्शन पैरामीटर के बाद हो सकता है function ($e) HERE
।
array_filter
समारोह केवल पर लौट $neededObject
यदि वापसी पर शर्त हैtrue
यदि $searchedValue
एक स्ट्रिंग या पूर्णांक है:
$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
var_dump($neededObject); // To see the output
अगर $searchedValue
वह सरणी है जहां हमें सूची के साथ जांच की आवश्यकता है:
$searchedValue = array( 1, 5 ); // Value to search.
$neededObject = array_filter(
$arrayOfObjects,
function ( $e ) use ( $searchedValue ) {
return in_array( $e->term_id, $searchedValue );
}
);
var_dump($neededObject); // To see the output
var_dump($neededObject);
:)
कभी-कभी मुझे खोज करने के लिए array_reduce () फ़ंक्शन का उपयोग करना पसंद है । यह array_filter () के समान है, लेकिन खोजे गए सरणी को प्रभावित नहीं करता है, जिससे आप एक ही सरणी के ऑब्जेक्ट पर कई खोज कर सकते हैं।
$haystack = array($obj1, $obj2, ...); //some array of objects
$needle = 'looking for me?'; //the value of the object's property we want to find
//carry out the search
$search_results_array = array_reduce(
$haystack,
function($result_array, $current_item) use ($needle){
//Found the an object that meets criteria? Add it to the the result array
if ($current_item->someProperty == $needle){
$result_array[] = $current_item;
}
return $result_array;
},
array() //initially the array is empty (i.e.: item not found)
);
//report whether objects found
if (count($search_results_array) > 0){
echo "found object(s): ";
print_r($search_results_array[0]); //sample object found
} else {
echo "did not find object(s): ";
}
if ($current_item->someProperty == $needle){ $result_array[] = $current_item; }
मैंने जावा कीमैप के कुछ प्रकार के साथ ऐसा किया। यदि आप ऐसा करते हैं, तो आपको हर बार अपने ऑब्जेक्ट सरणी पर लूप करने की आवश्यकता नहीं है।
<?php
//This is your array with objects
$object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65);
$object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25);
$object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75);
$firstArray = Array($object1,$object2);
var_dump($firstArray);
//create a new array
$secondArray = Array();
//loop over all objects
foreach($firstArray as $value){
//fill second key value
$secondArray[$value->id] = $value->name;
}
var_dump($secondArray);
echo $secondArray['123'];
उत्पादन:
array (size=2)
0 =>
object(stdClass)[1]
public 'id' => int 123
public 'name' => string 'Henk' (length=4)
public 'age' => int 65
1 =>
object(stdClass)[2]
public 'id' => int 273
public 'name' => string 'Koos' (length=4)
public 'age' => int 25
array (size=2)
123 => string 'Henk' (length=4)
273 => string 'Koos' (length=4)
Henk
मैंने एक त्वरित द्विआधारी खोज एल्गोरिथ्म का उपयोग करते हुए यहां इस समस्या को कुशलतापूर्वक हल करने के लिए क्या पोस्ट किया है: https://stackoverflow.com/a/52786742/1678210
मैं एक ही जवाब की नकल नहीं करना चाहता था। किसी और ने इसे थोड़ा अलग तरीके से पूछा था लेकिन जवाब एक ही है।