RK.
RK.

Reputation: 981

Remove the non-numeric prefix from array elements before using array in a database query's IN() condition

I have following array result :

Array (
    [0] => company_1
    [1] => company_10
    [2] => company_15
) 

I want the result something like this as I can use in the mysql IN query clause:

$result = "1, 10, 15";

I use explode function but again it is returning both array values separately like this:

Array (
    [0] => Array (
        [0] => company
        [1] => 1
    )
    [1] => Array (
        [0] => company
        [1] => 10
    )
    [2] => Array (
        [0] => company
        [1] => 15
    )
)   

But wondering how can I only get numbers separately?

Upvotes: 1

Views: 1741

Answers (3)

mickmackusa
mickmackusa

Reputation: 47894

PHP has a native function for this sanitization task: filter_var_array().

Code: (Demo)

$array = [
    'company_1',
    'company_10',
    'company_15',
];
var_export(
    filter_var_array($array, FILTER_SANITIZE_NUMBER_INT)
);

Or if the prefix is always known and has the same length, then substr_replace() will do. (Demo)

var_export(
    substr_replace($array, '', 0, 8)
);

Output (from either snippet):

array (
  0 => '1',
  1 => '10',
  2 => '15',
)

This array can then be passed into a prepared statement using advice found in: How can I bind an array of strings with a mysqli prepared statement?. There shouldbe no passing in of the value direct into an SQL string.

Upvotes: 0

Kevin
Kevin

Reputation: 41885

If your initial data is an array, just explode them again each them gather them inside then finally use implode. Example:

$result = array('company_1', 'company_10', 'company_15');
$result = array_map(function($piece){
    return explode('_', $piece)[1]; // note: for php 5.4 or greater
    // return str_replace('company_', '', $piece);
}, $result);
$result = implode(', ', $result);
echo $result; // 1, 10, 15

Upvotes: 3

xdazz
xdazz

Reputation: 160843

You have to pick the second part after you explode.

$result = array_map(function ($val) {
  $tmp = explode('_', $val);
  return isset($tmp[1]) ? $tmp[1] : null;
}, $array);

$result = implode(',', $result); // "1,10,5"

Upvotes: 1

Related Questions