简体   繁体   中英

how to search for key value in php multidimentional and return array with only search values

I have the following array

Array
(
    [0] => Array
        (
            [program] => 615
            [program_title_override] => 
            [campuses] => Array
                (
                    [0] => Array
                        (
                            [campus] => 572
                            [campus_title_override] => New Jersey - Moorestown
                        )

                )

        )

    [1] => Array
        (
            [program] => 313
            [program_title_override] => 
            [campuses] => Array
                (
                    [0] => Array
                        (
                            [campus] => 267
                            [campus_title_override] => Colorado - Denver
                        )

                    [1] => Array
                        (
                            [campus] => 269
                            [campus_title_override] => Connecticut - East Windsor
                        )

                    [2] => Array
                        (
                            [campus] => 277
                            [campus_title_override] => Illinois - Melrose Park (Chicago Area)
                        )

                    [3] => Array
                        (
                            [campus] => 279
                            [campus_title_override] => Indiana - Indianapolis
                        )

                    [4] => Array
                        (
                            [campus] => 281
                            [campus_title_override] => Maryland - Columbia
                        )

                    [5] => Array
                        (
                            [campus] => 570
                            [campus_title_override] => New Jersey  - Mahwah (Bergen County/NY Metro Area)
                        )

                    [6] => Array
                        (
                            [campus] => 580
                            [campus_title_override] => New Jersey - Union
                        )

                    [7] => Array
                        (
                            [campus] => 576
                            [campus_title_override] => New York - Queens
                        )

                    [8] => Array
                        (
                            [campus] => 574
                            [campus_title_override] => Pennsylvania - Philadelphia
                        )

                    [9] => Array
                        (
                            [campus] => 560
                            [campus_title_override] => Tennessee - Nashville
                        )

                    [10] => Array
                        (
                            [campus] => 557
                            [campus_title_override] => Texas - Grand Prairie (Dallas/Fort Worth Metroplex)
                        )

                )

        )

    [2] => Array
        (
            [program] => 617
            [program_title_override] => 
            [campuses] => Array
                (
                    [0] => Array
                        (
                            [campus] => 269
                            [campus_title_override] => Connecticut - East Windsor
                        )

                    [1] => Array
                        (
                            [campus] => 279
                            [campus_title_override] => Indiana - Indianapolis
                        )

                    [2] => Array
                        (
                            [campus] => 570
                            [campus_title_override] => New Jersey  - Mahwah (Bergen County/NY Metro Area)
                        )

                    [3] => Array
                        (
                            [campus] => 557
                            [campus_title_override] => Texas - Grand Prairie (Dallas/Fort Worth Metroplex)
                        )

                )

        )

    [3] => Array
        (
            [program] => 582
            [program_title_override] => 
            [campuses] => Array
                (
                    [0] => Array
                        (
                            [campus] => 267
                            [campus_title_override] => Colorado - Denver
                        )

                    [1] => Array
                        (
                            [campus] => 269
                            [campus_title_override] => Connecticut - East Windsor
                        )

                    [2] => Array
                        (
                            [campus] => 277
                            [campus_title_override] => Illinois - Melrose Park (Chicago Area)
                        )

                    [3] => Array
                        (
                            [campus] => 279
                            [campus_title_override] => Indiana - Indianapolis
                        )

                    [4] => Array
                        (
                            [campus] => 560
                            [campus_title_override] => Tennessee - Nashville
                        )

                    [5] => Array
                        (
                            [campus] => 557
                            [campus_title_override] => Texas - Grand Prairie
                        )

                )

        )

in the campus_title_override key if the value matches "New Jersey" I want to return the array result matching new jersey array key. In the current array, in the array 0, 1, and 2 it has the value "New Jersey" in the campus_title_override key. I want to only return array ids 0,1 and 2 . Whatever matches the key value to "New Jersey" I want to return the main array result set.

I have tried the following example from stackoverflow

function search($array, $key, $value)
{
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value) {
            $results[] = $array;
        }

        foreach ($array as $subarray) {
            $results = array_merge($results, search($subarray, $key, $value));
        }
    }

    return $results;
}


print_r(search($array, 'campus_title_override', 'New Jersey'));

and it returns empty result set.

I also have question on how I'd do the same on this array set:

       Array
(
    [0] => Array
        (
            [campus] => 269
            [campus_title_override] => Connecticut - East Windsor
            [programs] => Array
                (
                    [0] => Array
                        (
                            [program] => 313
                            [program_title_override] => 
                        )

                    [1] => Array
                        (
                            [program] => 582
                            [program_title_override] => 
                        )

                    [2] => Array
                        (
                            [program] => 617
                            [program_title_override] => 
                        )

                    [3] => Array
                        (
                            [program] => 584
                            [program_title_override] => 
                        )

                    [4] => Array
                        (
                            [program] => 619
                            [program_title_override] => 
                        )

                    [5] => Array
                        (
                            [program] => 621
                            [program_title_override] => 
                        )

                    [6] => Array
                        (
                            [program] => 625
                            [program_title_override] => 
                        )

                )

        )

    [1] => Array
        (
            [campus] => 271
            [campus_title_override] => Connecticut - New Britain
            [programs] => Array
                (
                    [0] => Array
                        (
                            [program] => 619
                            [program_title_override] => 
                        )

                    [1] => Array
                        (
                            [program] => 621
                            [program_title_override] => 
                        )

                    [2] => Array
                        (
                            [program] => 599
                            [program_title_override] => 
                        )

                    [3] => Array
                        (
                            [program] => 607
                            [program_title_override] => 
                        )

                )

        )

    [2] => Array
        (
            [campus] => 273
            [campus_title_override] => Connecticut - Shelton
            [programs] => Array
                (
                    [0] => Array
                        (
                            [program] => 619
                            [program_title_override] => 
                        )

                    [1] => Array
                        (
                            [program] => 599
                            [program_title_override] => 
                        )

                    [2] => Array
                        (
                            [program] => 607
                            [program_title_override] => 
                        )

                    [3] => Array
                        (
                            [program] => 609
                            [program_title_override] => 
                        )

                )

        )

    [3] => Array
        (
            [campus] => 283
            [campus_title_override] => Massachusetts - Somerville (Boston Area)
            [programs] => Array
                (
                    [0] => Array
                        (
                            [program] => 595
                            [program_title_override] => 
                        )

                    [1] => Array
                        (
                            [program] => 599
                            [program_title_override] => 
                        )

                    [2] => Array
                        (
                            [program] => 605
                            [program_title_override] => 
                        )

                )

        )

    [4] => Array
        (
            [campus] => 564
            [campus_title_override] => New Jersey - Iselin (Formerly located in Edison, NJ)
            [programs] => Array
                (
                    [0] => Array
                        (
                            [program] => 611
                            [program_title_override] => 
                        )

                    [1] => Array
                        (
                            [program] => 599
                            [program_title_override] => 
                        )

                    [2] => Array
                        (
                            [program] => 607
                            [program_title_override] => 
                        )

                )

        )

    [5] => Array
        (
            [campus] => 570
            [campus_title_override] => New Jersey - Mahwah (Bergen County/NY Metro Area)
            [programs] => Array
                (
                    [0] => Array
                        (
                            [program] => 313
                            [program_title_override] => 
                        )

                    [1] => Array
                        (
                            [program] => 617
                            [program_title_override] => 
                        )

                    [2] => Array
                        (
                            [program] => 619
                            [program_title_override] => 
                        )

                    [3] => Array
                        (
                            [program] => 621
                            [program_title_override] => 
                        )

                )

        )

Simply loop trough the array using a foreach loop

For every element loop trough it's campuses property and check if the conditions you want are found.

If the conditions are met, insert the main id into an array and break the 2nd for loop.

Example:

$ids = [];

$array = [
    [
        'campuses' => [
            [
                'campus_title_override' => 'a'
            ]
        ]
    ]
];

foreach ($array as $id => $obj)
{
    foreach ($obj['campuses'] as $campus)
    {
        if ($campus['campus_title_override'] == 'a')
        {
            array_push($ids, $id);
            break;
        }
    }
}

var_dump($ids);

You can learn more about Multi Demensional Arrays here and here .

Please read the articles to learn about what this code does, and don't just copy it ;)

You can use 2 foreach (1 for elements, 1 for the campuses) and strpos() to search if the value of campus_title_override contains the value of the search.

$array = array(/*your data*/); 
$search = "New Jersey";
$out = [];
// for each element in the array,
foreach ($array as $index => $item) {
  // for each campuses,
  foreach ($item['campuses'] as $campus) {
    // if 'campus_title_override' contains search,
    if (strpos($campus['campus_title_override'], $search) !== false) {
      $out[] = $item ;
      break; // no need to continue, we got the item.
    }
  }
}
print_r($out);

Outputs: ( https://3v4l.org/YRCma )

Array
(
    [0] => Array
        (
            [program] => 615
            [program_title_override] => 
            [campuses] => Array
                (
                    [0] => Array
                        (
                            [campus] => 572
                            [campus_title_override] => New Jersey - Moorestown
                        )

                )

        )

    [1] => Array
        (
            [program] => 313
            [program_title_override] => 
            [campuses] => Array
                (
                    [0] => Array
                        (
                            [campus] => 267
                            [campus_title_override] => Colorado - Denver
                        )

                    [1] => Array
                        (
                            [campus] => 269
                            [campus_title_override] => Connecticut - East Windsor
                        )

                    [2] => Array
                        (
                            [campus] => 277
                            [campus_title_override] => Illinois - Melrose Park (Chicago Area)
                        )

                    [3] => Array
                        (
                            [campus] => 279
                            [campus_title_override] => Indiana - Indianapolis
                        )

                    [4] => Array
                        (
                            [campus] => 281
                            [campus_title_override] => Maryland - Columbia
                        )

                    [5] => Array
                        (
                            [campus] => 570
                            [campus_title_override] => New Jersey  - Mahwah (Bergen County/NY Metro Area)
                        )

For array with a depth level 2 ie

array(
[0]   =>  array(
               [key]   => 'value'
          )
)

You can use array_search but it will not work for your array. To search you will have to manually search using foreach loop.

$mainArray = array(
        'compression' => array('7z', 'cbr', 'deb', 'gz', 'pkg', 'rar', 'rpm', 'sitx', 'tar.gz', 'zip', 'zipx'),
        'scripts' => array('php', 'js', 'css', 'asp', 'aspx', 'htm', 'html', 'cc', 'cpp', 'py', 'jsp'),
        'documentType' => array('txt', 'doc', 'docx', 'log', 'rtf'),
    );
    foreach($mainArray as $key=>$value){
        if (in_array(strtolower('php'), $value)){ // Return only if found during the loop
           return $key;
        }
    }

I hope this helps.

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