<?php

namespace OfficeBrain\Bundle\SearchBundle\Helper;

use Doctrine\Bundle\DoctrineBundle\Registry;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Query\ResultSetMapping;
use OfficeBrain\Bundle\SolrBundle\Helper\NewStandardHelper;
use OfficeBrain\Bundle\SolrBundle\Helper\StandardHelper;
#use OfficeBrain\Bundle\SearchBundle\ApiClient\SearchApiClient as searchapi;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
#use OfficeBrain\Bundle\SearchBundle\Helper\SearchHelper;
use Symfony\Component\HttpFoundation\Request;

/**
 * Search Helper class
 *
 * @author OfficeBrain 4220 <info@officebrain.com>
 *
 */
class SearchHelper
{
    public function __construct(Request $request, $serviceContainer)
	{   
		$this->request=$request;		
		$this->serviceContainer= $serviceContainer;
		$this->searchApi = $this->serviceContainer->get('office_brain_search_api');
		$this->colorFinalArray = array();
		if($this->serviceContainer->get('security.context')->getToken() != null)
		{
			$this->user = $this->serviceContainer->get('security.context')->getToken()->getUser();
		}
		else
		{
			$this->user = "";
		}
	}
   
  
    /**
     * format solr result for appropriate data mapping.
     * @param array $result
     *
     * @return array
     */
    public function formatSolrResult(array $result , $highlightResult = array())
    {
        $returnArray = array();
        if (is_array($result) && count($result) > 0) {
            foreach ($result as $key => $searchDocument) {
                foreach ($searchDocument->getFields() as $field => $value) {
                    // TODO if new dynamic data type is mapped in the Solr schema than we also need to add new type here
                    $field = preg_replace('/(_[f|t|i|txt|is|ss])$/', '', $field);
                    $returnArray[$key][$field] = $value;
                }
//                 if (is_object($highlightResult)) {
// 	                $highlightedDoc = $highlightResult->getResult($returnArray[$key]['id'])->getFields();
// 	                foreach ($highlightedDoc as $image) {
// 						if(is_array($image)){
// 	                	$colorImage = explode("|",$image[0]);
// 	                	$returnArray[$key]['colorSearchImage'] = $colorImage[2];
// 						}
	                	
// 	                }
//                 }
            }
        }
        return $returnArray;
    }
    /**
     * Get formated facet result.
     *
     * @param \PDO $doctrine Doctrine registery
     * @param array $resultSet Array result provided by facet
     * @param string $language language id
     * @param Object $cacheManager cache manager
     * @param integer $distributorId distributor id
     * @return array
     */
    public function formatFacetResult(EntityManager $em, $resultSet, $languageCode, $cacheManager = null, $distributorId = null, $serviceGroupId = null)
    {
        $returnArray = array();
        $countArr = array();
        $facetResult = $resultSet->getFacetSet()->getFacets();
        //echo $languageCode; die;
        if (array_key_exists('categoryId', $facetResult)) {
        	$categoryNameArray = $this->facetIdNameMerge($facetResult['categoryNameId']);
        	//$categoryNameArray = $this->facetKeyValueMerge($facetResult['categoryId'], $facetResult['categoryName']);
            $returnArray['categoryNameId'] = $categoryNameArray;
        }
        if (array_key_exists('size', $facetResult)) {
        	$sizeArray = $this->facetIdNameMerge($facetResult['size']);
        	$returnArray['size'] = $sizeArray;
        }
        if (array_key_exists('ink', $facetResult)) {
        	$inkArray = $this->facetIdNameMerge($facetResult['ink']);
        	$returnArray['ink'] = $inkArray;
        }
        if (array_key_exists('productionTimeId', $facetResult)) {
        	$productionTimeArray = $this->facetIdMerge($facetResult['productionTimeId']);;
        	$returnArray['productionTimeId'] = $productionTimeArray;
        }
        if (array_key_exists('fobId', $facetResult)) {
        	$fobArray = $this->facetFobMerge($facetResult['fobId']);;
        	$returnArray['fobId'] = $fobArray;
        }
        if (array_key_exists('categoryNameId', $facetResult)) {
        	$categoryNameIdArray = $this->facetIdNameMerge($facetResult['categoryNameId']);
        	$returnArray['categoryIdName'] = $categoryNameIdArray;
        }
        if (array_key_exists('inactiveCategoryId', $facetResult)) {
        	$inactiveCategoryIdArray = $this->facetIdNameMerge($facetResult['inactiveCategoryId']);
        	$returnArray['inactiveCategoryId'] = $categoryNameIdArray;
        }
        if (array_key_exists('colorMapping', $facetResult)) {
        	$this->filterColor($facetResult['colorMapping']->getValues());
            $returnArray['colorMapping'] = $this->colorFinalArray;
            
            //EMP4464: Added this code to put "Other" and "Group" color in last - Start
            //For Master Color
            $tempColorMapping = $returnArray['colorMapping'];
            foreach ($tempColorMapping as $index => $masterColor){
                if(strtolower($masterColor['master_name']) == 'other' || strtolower($masterColor['master_name']) == 'group'){
                    unset($returnArray['colorMapping'][$index]);
                    array_push($returnArray['colorMapping'], $masterColor);
                }
            }
            
            //For Actual Color
            $tempColorMapping = $returnArray['colorMapping'];
            foreach ($tempColorMapping as $index => $masterColor){
                if(!empty($masterColor['actual_color'])){
                    foreach ($masterColor['actual_color'] as $actualColorIndex => $actualColor){
                        if(strtolower($actualColor['actual_name']) == 'other' || strtolower($actualColor['actual_name']) == 'group'){
                            unset($returnArray['colorMapping'][$index]['actual_color'][$actualColorIndex]);
                            array_push($returnArray['colorMapping'][$index]['actual_color'], $actualColor);
                        }
                    }
                }
            }
            //EMP4464: Added this code to put "Other" and "Group" color in last - End
        }

        if (array_key_exists('supplierId', $facetResult)) {
            $supplierNameArray = $this->facetKeyValueMerge($facetResult['supplierId'], $facetResult['supplierName']);
             
            $returnArray['supplierNameId'] = $supplierNameArray;
        }
        //Emp ID:4014 Added for Original Supplier ID
        if (array_key_exists('originalSupplierId', $facetResult)) {
        	$originalSupplierIdArray = $this->facetIdNameMerge($facetResult['originalSupplierId']);
        	$returnArray['originalSupplierId'] = $originalSupplierIdArray;
        
        }
        if (array_key_exists('lineNameId', $facetResult)) {
            $lineNameArray = $this->facetKeyValueMerge($facetResult['lineNameId'], $facetResult['lineName']);
            $lineNameIdNameArray = $this->facetIdNameMerge($facetResult['lineNameIdName']);
            
            $returnArray['lineNameId'] = $lineNameArray;
            $returnArray['lineNameIdName'] = $lineNameIdNameArray;
        }
        if (array_key_exists('catalogYear', $facetResult)) {
        	$returnArray['catalogYear'] = array();
        	foreach($facetResult['catalogYear']->getValues() as $catYear=>$count)
        	{
        		if($catYear != '' && $count != 0){
        			$returnArray['catalogYear'][$catYear]=$count;
        		}
        	}
            krsort($returnArray['catalogYear']);
        }
         
        if (array_key_exists('publicCustomTagText', $facetResult)) {
        	//$customTags = $this->customTagsMerge($facetResult['privateCustomTagText']->getValues(),$facetResult['privateCustomTagText']->getValues());
        	$tempTags = $facetResult['publicCustomTagText']->getValues();
        	foreach ($tempTags as $key=>$value)
        	{
	        	if($value == 0){
	        		unset($tempTags[$key]);
	        	}
        	}
        	$returnArray['publicCustomTagText'] = $tempTags;
        	unset($tempTags);
        }
        
        if (array_key_exists('priceValidUntil', $facetResult)) {
            $returnArray['priceValidUntil'] = $facetResult['priceValidUntil']->getValues();
//             uksort($returnArray['priceValidUntil'], function ($a, $b) {
//                 $a = \DateTime::createFromFormat('m/d/Y', $a);
//                 $b = \DateTime::createFromFormat('m/d/Y', $b);
                    
//                 return $a->getTimestamp() < $b->getTimestamp();
//             });
        }
        if (array_key_exists('priceCurrency', $facetResult)) {
            $priceCurrency = $facetResult['priceCurrency']->getValues();
            $i = 0;
            foreach ($priceCurrency as $key=>$value) {
                $returnArray['priceCurrency'][$i]['value'] = $key;
                $returnArray['priceCurrency'][$i]['count'] = $value;
                $i++;
            }
        }
        
//         if(isset($facetResult['productAttribute'])){
//         	$productAttribute = $facetResult['productAttribute']->getValues();
//         	$productAttributeVal = $this->getProductAttributeArray($productAttribute);
//         	$returnArray['productAttribute'] = $productAttributeVal;
//         }
        $returnArray['productAttribute'] ='';
       /*  $statResults = $resultSet->getStats();
        if (count($statResults) > 0) {
            foreach ($statResults as $statResult) {
                if ($statResult->getName() == 'min_price_f') {
                    // for minimum price we will take a floor value
                    $returnArray['priceRange']['minPrice'] = floor($statResult->getMin());
                } elseif ($statResult->getName() == 'max_price_f') {
                    // for maximum price we will take a ceiling value
                    $returnArray['priceRange']['maxPrice'] = ceil($statResult->getMax());
                }
            }
        } */
        
        //Price range with actual floating number
        $statResults = $resultSet->getStats();
        //echo "<pre>";print_r($statResults);exit;
        if (count($statResults) > 0) {
        	foreach ($statResults as $statResult) {
        	/* if ($statResult->getName() == 'min_price_'.$serviceGroupId.'_f' ) {//|| $statResult->getName() == 'max_price_'.$serviceGroupId.'_f') {
	        		if ($statResult->getName() == 'min_price_'.$serviceGroupId.'_f') {
	        			// for minimum price we will take a floor value
	        			$returnArray['priceRange']['minPrice'] = $statResult->getMin();
	        		} 
	        		/* elseif ($statResult->getName() == 'max_price_'.$serviceGroupId.'_f')
	        		{
	        			// for maximum price we will take a ceiling value
	        			$returnArray['priceRange']['maxPrice'] = $statResult->getMax();
	        		} */
        		/*}
        		elseif ($statResult->getName() == 'max_price_'.$serviceGroupId.'_f')
        		{
        			// for maximum price we will take a ceiling value
        			$returnArray['priceRange']['maxPrice'] = $statResult->getMax();
        		}
        		else{
        	
	        		if ($statResult->getName() == 'min_price_f') {
	        			// for minimum price we will take a floor value
	        			$returnArray['priceRange']['minPrice'] = $statResult->getMin();
	        		} elseif ($statResult->getName() == 'max_price_f') {
	        			// for maximum price we will take a ceiling value
	        			$returnArray['priceRange']['maxPrice'] = $statResult->getMax();
	        		}
        		}	 */
        		
        		if(isset($this->user) && is_object($this->user) && (!(empty($this->user))) && $this->user->getId()>0 )
        		{
	       			if ($statResult->getName() == 'coded_min_price_'.$serviceGroupId.'_f' && !empty($statResult->getMin())) {
	       				// for minimum price we will take a floor value
	       				$returnArray['priceRange']['minPrice'] = $statResult->getMin();
	       			}
	        		elseif ($statResult->getName() == 'coded_max_price_'.$serviceGroupId.'_f' && !empty($statResult->getMax()))
	        		{
	        			// for maximum price we will take a ceiling value
	        			$returnArray['priceRange']['maxPrice'] = $statResult->getMax();
	        		}
	        		else
	        		{
	        			if ($statResult->getName() == 'coded_min_price_f' && (!isset($returnArray['priceRange']['minPrice']))) {
	        				// for minimum price we will take a floor value
	        				$returnArray['priceRange']['minPrice'] = $statResult->getMin();
	        			} elseif ($statResult->getName() == 'coded_max_price_f' && (!isset($returnArray['priceRange']['maxPrice']))) {
	        				// for maximum price we will take a ceiling value
	        				$returnArray['priceRange']['maxPrice'] = $statResult->getMax();
	        			}
	        			
	        			if ($statResult->getName() == 'us_coded_min_price_f' && (!isset($returnArray['priceRange']['usMinPrice']))) {
	        				// for minimum price we will take a floor value
	        				$returnArray['priceRange']['usMinPrice'] = $statResult->getMin();
	        			} elseif ($statResult->getName() == 'us_coded_max_price_f' && (!isset($returnArray['priceRange']['usMaxPrice']))) {
	        				// for maximum price we will take a ceiling value
	        				$returnArray['priceRange']['usMaxPrice'] = $statResult->getMax();
	        			}
	        			if ($statResult->getName() == 'ca_coded_min_price_f' && (!isset($returnArray['priceRange']['caMinPrice']))) {
	        				// for minimum price we will take a floor value
	        				$returnArray['priceRange']['caMinPrice'] = $statResult->getMin();
	        			} elseif ($statResult->getName() == 'ca_coded_max_price_f' && (!isset($returnArray['priceRange']['caMaxPrice']))) {
	        				// for maximum price we will take a ceiling value
	        				$returnArray['priceRange']['caMaxPrice'] = $statResult->getMax();
	        			}
	        		}
        		}
        		else
        		{
        			
	       			if ($statResult->getName() == 'min_price_'.$serviceGroupId.'_f' && !empty($statResult->getMin())) {
	       				// for minimum price we will take a floor value
	       				$returnArray['priceRange']['minPrice'] = $statResult->getMin();
	       			}
	        		elseif ($statResult->getName() == 'max_price_'.$serviceGroupId.'_f' && !empty($statResult->getMax()))
	        		{
	        			// for maximum price we will take a ceiling value
	        			$returnArray['priceRange']['maxPrice'] = $statResult->getMax();
	        		}
	        		else
	        		{
	        			if ($statResult->getName() == 'min_price_f' && (!isset($returnArray['priceRange']['minPrice']))) {
	        				// for minimum price we will take a floor value
	        				$returnArray['priceRange']['minPrice'] = $statResult->getMin();
	        			} elseif ($statResult->getName() == 'max_price_f' && (!isset($returnArray['priceRange']['maxPrice']))) {
	        				// for maximum price we will take a ceiling value
	        				$returnArray['priceRange']['maxPrice'] = $statResult->getMax();
	        			}
	        			
	        			if ($statResult->getName() == 'us_min_price_f' && (!isset($returnArray['priceRange']['usMinPrice']))) {
	        				// for minimum price we will take a floor value
	        				$returnArray['priceRange']['usMinPrice'] = $statResult->getMin();
	        			} elseif ($statResult->getName() == 'us_max_price_f' && (!isset($returnArray['priceRange']['usMaxPrice']))) {
	        				// for maximum price we will take a ceiling value
	        				$returnArray['priceRange']['usMaxPrice'] = $statResult->getMax();
	        			}
	        			if ($statResult->getName() == 'ca_min_price_f' && (!isset($returnArray['priceRange']['caMinPrice']))) {
	        				// for minimum price we will take a floor value
	        				$returnArray['priceRange']['caMinPrice'] = $statResult->getMin();
	        			} elseif ($statResult->getName() == 'ca_max_price_f' && (!isset($returnArray['priceRange']['caMaxPrice']))) {
	        				// for maximum price we will take a ceiling value
	        				$returnArray['priceRange']['caMaxPrice'] = $statResult->getMax();
	        			}
	        		}
        		}
        	}
        }
        //echo "exit here";exit;
        //echo "<pre>";print_r($returnArray['priceRange']);exit;

        
    	return $returnArray;
    }
    
    private function customTagsMerge($publicCustomTagText, $privateCustomTagText)
    {	
		$mergeCustomeTagsArray = array();
		foreach($publicCustomTagText as $k1=>$v1){
			$mergeCustomeTagsArray[] = array("name"=> $k1,"count" => $v1);
		}	
		foreach($privateCustomTagText as $k2=>$v2){
			$mergeCustomeTagsArray[] = array("name"=> $k2,"count" => $v2);
		}
		return $mergeCustomeTagsArray;		
    }
    
    public function filterColor($colorMapping)
    {
    	array_unique($colorMapping);
    	foreach($colorMapping as $color => $colorValue){
    		if($colorValue != 0)
    		{
	    		$temp = explode('|',$color);
	    
	    		$tempMaster = explode('##',$temp[0]);
	    
	    		$tempActual = explode('##',$temp[1]);
	    		if($tempMaster[0] != null){
		    		$check = $this->searchArrayMultidimensional($tempMaster[0],'master_id',$this->colorFinalArray );
		    		if(trim($check) != null)
		    		{
		    
		    			$this->colorFinalArray[$check]['actual_color'][] = array('actual_id' => $tempActual[0] , 'actual_name' => $tempActual[1] ,'count'=> $colorValue);
		    
		    		}
		    		else
		    		{
		    
		    			$this->colorFinalArray[] = array('master_id'=> $tempMaster[0],
		    					'master_name' => $tempMaster[1],
		    					'actual_color' => array(
		    							'0'=> array('actual_id' => $tempActual[0] , 'actual_name' => $tempActual[1],'count'=> $colorValue )));
		    		}
	    		}
    		}
    		
    	}
    	
    	unset($colorMapping);
    	unset($temp);
    	unset($tempMaster);
    	unset($tempActual);
    	unset($check);
    }
    
    public function searchArrayMultidimensional($chechValue, $field,$array)
    {
    
    	foreach($array as $key => $value)
    	{
	    		if ( $value[$field] == $chechValue )
	    		 return $key;
    	}
    	return false;
    }

    function array_combine2($arr1, $arr2) {
    	$count = min(count($arr1), count($arr2));
    	return array_combine(array_slice($arr1, 0, $count), array_slice($arr2, 0, $count));
    }
    
    public function facetIdNameMerge($arrayId)
    {
    	$countArrayId = $arrayId->getValues();
    	$finalArray = array();
    	foreach ($countArrayId as $key=> $value) {
    		$catIdName = explode("|",$key);
    		if($catIdName[1]=='') continue;
	    	$finalArray[] = array('id' => $catIdName[0], 'name'=> $catIdName[1], 'count' => $countArrayId[$key]);
    	}
      usort($finalArray, function($a, $b) {
          return strcmp($a["name"], $b["name"]);
      });
    	return $finalArray;
    }
    public function facetIdMerge($arrayId)
    {
    	$countArrayId = $arrayId->getValues();
    	$finalArray = array();
    	$i = 0;
    	foreach ($countArrayId as $key=> $value) {
	    	$productionTimeUnit = explode("_",$key);
    		$productionTime = $productionTimeUnit[0];
    		$productionUnit = $productionTimeUnit[1];
    		if($productionUnit == 'days'){
    			$finalDaysArray[$i] = array('id' => $productionTime."_".$productionUnit,'value' => $productionTime." ".$productionUnit, 'count' => $countArrayId[$key]);
    		}else if($productionUnit == 'hours'){
    			$finalHoursArray[$i] = array('id' => $productionTime."_".$productionUnit,'value' => $productionTime." ".$productionUnit, 'count' => $countArrayId[$key]);
    		}else if($productionUnit == 'week'){
    			$finalWeekArray[$i] = array('id' => $productionTime."_".$productionUnit,'value' => $productionTime." ".$productionUnit, 'count' => $countArrayId[$key]);
    		}else{
    			$finalExtraArray[$i] = array('id' => $productionTime."_".$productionUnit,'value' => $productionTime." ".$productionUnit, 'count' => $countArrayId[$key]);
    		}
    		//$finalArray[] = array('id' => $productionTime."_".$productionUnit,'value' => $productionTime." ".$productionUnit, 'count' => $countArrayId[$key]);
    		$i++;
    	}
    	usort($finalDaysArray, function($a, $b) {
    		return strnatcasecmp($a["id"], $b["id"]);
    	});
    	usort($finalHoursArray, function($a, $b) {
    		return strnatcasecmp($a["id"], $b["id"]);
    	});
    	usort($finalWeekArray, function($a, $b) {
    		return strnatcasecmp($a["id"], $b["id"]);
    	});
    	$daysKeyStartPt = count($finalHoursArray);
    	$weekKeyStartPt = $daysKeyStartPt + count($finalDaysArray);
    	$finalDaysArrayVal = array();
    	$finalWeekArrayVal = array();
    	foreach($finalDaysArray as $key=>$val){
    		$finalDaysArrayVal[$daysKeyStartPt] = $val;
    		$daysKeyStartPt++;
    	}
    	foreach($finalWeekArray as $k=>$v){
    		$finalWeekArrayVal[$weekKeyStartPt] = $v;
    		$weekKeyStartPt++;
    	}
    	$finalArray = array_merge($finalHoursArray,$finalDaysArrayVal,$finalWeekArrayVal);
    	return $finalArray;
    }
    public function facetFobMerge($arrayId)
    {
    	$countArrayId = $arrayId->getValues();
    	$finalArray = array();
    	//echo '<pre>'; print_r($countArrayId); die;
    	foreach ($countArrayId as $key=> $value) {
    		$fobArray = explode("#",$key);
	    	if(isset($fobArray) && $fobArray[0]!='' && $fobArray[1]!='') {
	    		$fobArray_state = str_replace("_"," ",$fobArray[0]);
				$fobValue = $fobArray_state.", ".$fobArray[1];
			}
			else {
				$fobValue = str_replace("_"," ",$key);
			}
    		$finalArray[] = array('id' => $key,'value' => $fobValue, 'count' => $countArrayId[$key]);
    	}
    	usort($finalArray, function($a, $b) {
    		return strcmp($a["id"], $b["id"]);
    	});
    	return $finalArray;
    }
    public function facetKeyValueMerge($arrayId, $arrayName)
    {
        $countArrayId = $arrayId->getValues();
        $countArrId = array_keys($countArrayId);
        $countArr = array_keys($arrayName->getValues());
        $tempArray = $this->array_combine2($countArrId, $countArr);
        asort($tempArray);
        $finalArray = array();
        foreach ($tempArray as $key=> $value) {
        	$finalArray[] = array('id' => $key, 'name'=> $value, 'count' => $countArrayId[$key]);
        }
		unset($countArrayId, $countArrId, $countArr, $tempArray);
       
        return $finalArray;
    }
    /*
     * 4532
     * This function is for make dynamic attribute array,
     */
    function getProductAttributeArray($productAttribute){
    	
    	$attributeType = array();
    	$attributeValue = array();
    	
    	$searchObj = $this->serviceContainer->get('office_brain_search_manager');
    	$cultureCode = $searchObj->getCurrentCultureCode();
    	
    	foreach($productAttribute as $key=>$value){
    		$attribute = explode('|',$key);
    		$attributeType[] = trim($attribute[0]);
    		$attributeValue[] = trim($attribute[1]);
    	}
    	$attributeType = array_unique($attributeType);
    	$attributeType = json_encode($attributeType);
    	
    	
    	$this->searchApi->init('attribute_type_info');
    	$this->searchApi->setCallParameters(array('culture_code'=>$cultureCode,'attribute_id' => $attributeType));
    	$this->searchApi->doProcess();
    	if ($this->searchApi->isSuccess()) {
    		$attributeTypeResult = $this->searchApi->getResultArray();
    	}
    	
    	$attributeValue = array_unique($attributeValue);
    	$attributeValue = json_encode($attributeValue);
     	
    	
    	$this->searchApi->init('attribute_value_info');
    	$this->searchApi->setCallParameters(array('culture_code'=>$cultureCode,'attribute_id' => $attributeValue));
    	$this->searchApi->doProcess();
    	if ($this->searchApi->isSuccess()) {
    		$attributeValueResult = $this->searchApi->getResultArray();
    	}
		$attributeFinalArray = array();
		$i = 0;
    	foreach($productAttribute as $key=>$value){
    		$attribute = explode('|',$key);
    		$attributeType = trim($attribute[0]);
    		$attributeValue = trim($attribute[1]);
    		$attributeTypeName = $this->multiArraySearch($attributeType,$attributeTypeResult,'type');
    		$attributeValueName = $this->multiArraySearch($attributeValue,$attributeValueResult,'value');
    		
    		$attributeFinalArray[$attributeTypeName][$i]['name'] = $attributeValueName;
    		$attributeFinalArray[$attributeTypeName][$i]['count'] = $value;
    		$attributeFinalArray[$attributeTypeName][$i]['filter_key'] = $key;
    		$i++;
    		
    	}
    	return $attributeFinalArray;
    }
    /*
     * 4532
     * This function is for search value from array
     */
    
    function multiArraySearch($search_for, $search_in, $type) {
    	if($type == 'type'){
    		$key_id = 'id';
    		$key_value = 'label';
    	}else if($type == 'value'){
    		$key_id = 'attribute_value_id';
    		$key_value = 'attribute_value';
    	}
    	foreach ($search_in as $element) {
    		if ( (isset($element[$key_id]) && $element[$key_id] === $search_for) ){
    			return $element[$key_value];
    		}
    	}
    	return false;
    }
}