i've two arrays:

    $a =array(   
        'standard'      => (object) array( 'id' => 'standard',      'title' => 'AustPost Standard' ), 
        'registered'    => (object) array( 'id' => 'registered',    'title' => 'AustPost Registered' ), 
        'insured'       => (object) array( 'id' => 'insured',       'title' => 'AustPost Insured' ),
        'express'       => (object) array( 'id' => 'express',       'title' => 'AustPost Express' ),
        'satchexp'      => (object) array( 'id' => 'satchexp',      'title' => 'AustPost Satchel Express' ),
        'satchreg'      => (object) array( 'id' => 'satchreg',      'title' => 'AustPost Satchel Registered' ),
        'satchpla'      => (object) array( 'id' => 'satchpla',      'title' => 'AustPost Satchel Platnium' )


$b = array( 'standard', 'sea', 'air', 'satchexp', 'satchreg', 'satchpla' )

how do i produce a new array $c which has only components from array $a that come in array $b?

It's known as array intersection

It can be done either by key or value. Inside your situation in $a you've (standard', 'sea', 'air'..) as secrets, however in $b individuals test is really values and also the secrets are (, 1, 2...)

You are able to easilly switch the array $b to create what array secrets. You'll be able to intersect arrays by secrets

$c = array_intersect_key($a, array_flip($b));