1

In this array I have user with her ID:

$data = array( 'USER : Alex K. id:1', 'USER : Robert K. id:2');

The name on the id 1 is "Alex K." and on the id 2 is

foreach ( $data as $string )
{
    $_a = explode( ':', $string );
    $_b = explode( ' ', $_a[1] );
    $inf[$_a[2]] = $_b[1];
}

If i use print_r( $inf[ID] ); for example print_r( $inf[2] ); this show me only "Robert" but no "Robert K.";

I try with print_r( $_b ); and I get all data buy I donw know how print the complete name.

Someone know how do it?

2 Answers 2

2

If the format of the array's members is always the same, you can simply grab specific parts of the string, eg. using preg_match:

foreach ($data as $string) {
    preg_match('/USER : (?<name>.*?) id:(?<id>\d+)/', $string, $match);

    printf('User: %s. His ID: %d', $match['name'], $match['id']);
}

Otherwise you have to "clean" the input string before exploding it by a "space" – by removing the noise, things you don't need, like the USER : part (functions which may come in handy: str_replace / substr etc.)

If you need to somehow manipulate this list, you would have to index it first, eg. by the id:

$users = [];

foreach ($data as $string) {
    preg_match('/USER : (?<name>.*?) id:(?<id>\d+)/', $string, $match);

    $users[$match['id']] = $match['name'];
}

printf('User name with ID 1 is: %s', $users[1]);
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks but how can I filtre ir with a ID?
I don't know what do you mean by "filter"
For example If I want show the name of the user with the id number 2, how can I do it with your code?
1

If you don't plan on performing any other searches on the input array, then you don't need to generate a new, re-structured, associative lookup array.

preg_filter() will find your user by id and isolate the user name in one step.

Code: (Demo) (or if users may have colons in their names)

$data = ['USER : Alex K. id:1', 'USER : Robert K. id:2'];
$id = 2;
var_export(current(preg_filter('/USER : ([^:]*) id:' . $id . '$/', '$1', $data)));

Output:

'Robert K.'

preg_filter() will iterate all of the elements and try to modify them, but since the $id variable at the end of the pattern will only allow one of the elements to be matched/modified, it will be the only element in the returned data.

current() will grab the first/only element if there is one. If there is no match, then the output will be false.

I am using var_export() to show that there are no leading or trailing spaces -- you can use echo just the same.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.