I wrote this code to find domain names in an array in PHP. My question is how to find the position of the key without using a loop.
I wrote both forms to show my meaning.
<?php
$unique_domains = array( "www.crownworldwide.com","www.acquisition.gov", "www.hemisphere-freight.com",
"www.businessinsider.com","www.oceansidelogistics.com","mixjet.aero","www.airindiaexpress.in", "rlglobal.com",
"www.metroshipping.co.uk","www.flexport.com"
);
$position = array_search("flexport.com",$unique_domains);
echo "position is ". $position . "<br>";
<----------------------------------------->
$position2 = 0 ;
foreach ($unique_domains as $key ) {
$position2 ;
if(preg_match('/'.preg_quote("flexport.com").'\b/',$key)){
echo "position is ".$position2 ;
}
}
?>
On the first method I was not able to find the position as it has www. at the beginning. On the second method I can find the position but I do not want to use a loop in my live platform. What are the alternative to find the domain names inside an array?
CodePudding user response:
$unique_domains = [
'www.crownworldwide.com',
'www.acquisition.gov',
'www.hemisphere-freight.com',
'www.businessinsider.com',
'www.oceansidelogistics.com',
'mixjet.aero',
'www.airindiaexpress.in',
'rlglobal.com',
'www.metroshipping.co.uk',
'www.flexport.com'
];
$position = array_key_first(array_filter($unique_domains, fn($val) => str_contains($val, 'flexport.com')));
echo 'position is ' . $position;
CodePudding user response:
$input = preg_quote('flexport.com', '~'); // don't forget to quote input string!
$data = array("www.crownworldwide.com","www.acquisition.gov", "www.hemisphere-freight.com",
"www.businessinsider.com","www.oceansidelogistics.com","mixjet.aero","www.airindiaexpress.in", "rlglobal.com",
"www.metroshipping.co.uk","www.flexport.com");
$result = preg_grep('~' . $input . '~', $data);
var_dump($result); // array(1) { [9]=> string(16) "www.flexport.com" }
array_keys($result); // [9]
CodePudding user response:
Another way is to use strpos() and a simple foreach. This method avoid the iteration of all items of the array and stops when a match is found.
/**
* Returns the index of the first match or -1 if not found.
*/
function arraySearch(array $array, string $search): int
{
foreach ($array as $key => $value) {
if (strpos($value, $search) !== false) {
return $key;
}
}
return -1;
}
$unique_domains = [
'www.crownworldwide.com',
'www.acquisition.gov',
'www.hemisphere-freight.com',
'www.businessinsider.com',
'www.oceansidelogistics.com',
'mixjet.aero',
'www.airindiaexpress.in',
'rlglobal.com',
'www.metroshipping.co.uk',
'www.flexport.com'
];
$position = arraySearch($unique_domains, 'flexport.com');
echo $position; // 9
CodePudding user response:
You can use array_filter, preg_match with array_keys.
function position($s) {
$unique_domains = [
'www.crownworldwide.com',
'www.acquisition.gov',
'www.hemisphere-freight.com',
'www.businessinsider.com',
'www.oceansidelogistics.com',
'mixjet.aero',
'www.airindiaexpress.in',
'rlglobal.com',
'www.metroshipping.co.uk',
'www.flexport.com'
];
return array_keys(array_filter($unique_domains, function($elm) use ($s){
if (preg_match('/'.$s.'/', $elm)) {
return true;
}
return false;
}))[0] ?? null;
}
print_r(position('flexport.com')); // 9
print_r(position('www.flexport.com')); // 9
print_r(position('.com')); // 0
working example https://3v4l.org/NCapg
