简体   繁体   中英

Searching all values from a specific Index in multidimensional, associative Array in php by Index, not by value

with some help of this forum i found a way to get an array that perfectly fits my task. I ran into a follow-up problem tho:

I got the following example-array

Array ( 
[A] => Array (
 [D] => Array (
  [A] => Array (
   [M] => Array (
    [result] => ADAM )
   [N] => Array (
    [result] => ADAN )
      )
    )
  )  
  [H] => Array (
   [E] => Array (
    [N] => Array (
     [R] => Array (
      [Y] => Array (
       [result] => HENRY )
       )
    [N] => Array (
     [E] => Array (
      [S] => Array (
       [result] => HENNES )
           )
         )
       )
     )
   )
 )

Where the Letters are Indexes and i end up with an result array for each name. Now i am looking for a way to Search this array with a specific search-string and it should be possible from the 3rd Char on. So if i Search for 'ADA' i want to get the value from all following result-arrays which would be "ADAM" and "ADAN" as both follow on Array['A']['D']['A'].

I didnt have any trouble starting to search at the right Index but i cant figure out a way to access all 'result'-arrays. Only found ways to search for the final Value (ADAM, ADAN) but as statet im looking for all final values possible from my searchpoint.

So basically i want to get all Values from the result arrays following the last Char from my Search-String as Index of my Array. Hopefully that explanation points out what im looking for.

Thanks in Advance!

In short:

//my Input
$searchstring = 'ADA';

//Output i want

"ADAM",  "ADAN";

//Input
$searchstring = 'ADAM';

//Output

"ADAM"

EDIT: I edited this question with my approach so far as a comment pointed out i should do this (thanks for that! ) so i tried to go this way:

When i had my Example-Array i tried to only select the necessary part of the structure:

$searchquery = 'HEN';
//Searchquery as Array
$check = str_split($searchquery);
//second isntance of the original array which is named $result
$finalsearch = $result;
foreach($check as $key) {
    $finalsearch = $finalsearch[$key];
}
//check with output if i selected the right area
print_r($finalsearch);

Output i got from this: Array ( [R] => Array ( [Y] => Array ( [result] => HENRY ) ) [N] => Array ( [E] => Array ( [S] => Array ( [result] => HENNES ) ) ) ) So i am in the right are of the structure.

then i tried to find ways to search for all Instances of the index 'result'.

i found the following functions and approaches that all enabled me to search for a specific value but not the indexes.

$newArray = array_values($finalsearch);

array-search($searchquery, $finalsearch);

That was the Point where i started turning in circles

First part is to find the start point for the list, this is just a case of looping over each character in the search string and moving onto that value in the array.

Once you have found the start point, you can usearray_walk_recursive() which will only visit the leaf nodes - so this will only be the names (in this case), so create a list of all these nodes and return them...

function getEntry ( array $result, string $search )  {
    for($i = 0; isset($search[$i]); $i++){
        $result = $result[$search[$i]];
    }
    $output = [];
    array_walk_recursive($result, function ( $data ) use (&$output)   {
        $output[] = $data;
    });
    return $output;
}

$searchstring = 'ADA';
print_r(getEntry($result, $searchstring));

which should give...

Array
(
    [0] => ADAM
    [1] => ADAN
)

This script first iterates over the keys containing the chars of $searchstring and if it has found it and no errors were thrown, it walks the array recursively to find all result keys to add it to the $result array. After that it implodes the $result array and echos it.

$searchstring = 'HE';

for( $i = 0; $i < strlen( $searchstring ); $i++ )  {
  $sub = @( isset( $sub ) ? $sub[$searchstring[$i]] : $array[$searchstring[$i]] ) 
         or die( 'no results found' );
}

array_walk_recursive( $sub, function( $value ) use ( &$results )  {
  $results[] = $value;
});

echo implode( ', ', $results );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM