Home > Software design >  using array_search or loop in PHP to find the position of a key
using array_search or loop in PHP to find the position of a key

Time:01-23

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

live demo

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

  •  Tags:  
  • Related