PHP multidimensionale array zoeken op waarde

Ik heb een array waarin ik de uidwil doorzoeken en de sleutel van de array wil krijgen.

Voorbeelden

Stel dat we de volgende 2-dimensionale array hebben:

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);

De functieaanroep search_by_uid(100)(uid van eerste gebruiker) zou 0moeten retourneren.

De functieaanroep search_by_uid(40489)moet 2teruggeven.

Ik heb geprobeerd loops te maken, maar ik wil een snellere code.


Antwoord 1, autoriteit 100%

function searchForId($id, $array) {
   foreach ($array as $key => $val) {
       if ($val['uid'] === $id) {
           return $key;
       }
   }
   return null;
}

Dit zal werken. Je zou het zo moeten noemen:

$id = searchForId('100', $userdb);

Het is belangrijk om te weten dat als u de operator ===gebruikt, de vergelijkingstypen exact hetzelfde moeten zijn, in dit voorbeeld moet u zoeken op stringof gewoon ==in plaats daarvan ===.

Gebaseerd op angoruantwoord. In latere versies van PHP (>= 5.5.0) kunt u one-liner gebruiken.

$key = array_search('100', array_column($userdb, 'uid'));

Hier is documentatie: http://php.net/Manual/en/ functie.array-column.php .


Antwoord 2, Autoriteit 67%

Als u gebruikt (PHP 5 & GT; = 5.5.0) hoeft u niet uw eigen functie te schrijven om dit te doen, schrijf gewoon deze regel en het is klaar.

Als u slechts één resultaat wilt:

$key = array_search(40489, array_column($userdb, 'uid'));

Voor meerdere resultaten

$keys = array_keys(array_column($userdb, 'uid'), 40489);

Als u een associatieve array hebt, zoals hierdoor in de opmerkingen kunt maken, kunt u het maken:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);

Als u PHP & LT gebruikt; 5.5.0, u kunt deze backport , bedankt Ramsey!

Update: Ik heb een aantal eenvoudige benchmarks gemaakt en het formulier meerdere resultaten lijkt de snelste te zijn, zelfs sneller dan de JAKUB Aangepaste functie!


Antwoord 3, Autoriteit 8%

In latere versies van PHP (& GT; = 5.5.0) kunt u deze one-liner gebruiken:

$key = array_search('100', array_column($userdb, 'uid'));

Antwoord 4, Autoriteit 5%

Building Jakub’s Uitstekend antwoord , hier is een meer gegeneraliseerde zoekopdracht waarmee de sleutel is opgegeven (niet alleen voor UID):

function searcharray($value, $key, $array) {
   foreach ($array as $k => $val) {
       if ($val[$key] == $value) {
           return $k;
       }
   }
   return null;
}

Gebruik: $results = searcharray('searchvalue', searchkey, $array);


Antwoord 5, autoriteit 4%

Ik weet dat dit al is beantwoord, maar ik heb dit gebruikt en het iets uitgebreider in mijn code zodat je niet alleen op de uid hoeft te zoeken. Ik wil het gewoon delen voor iedereen die die functionaliteit misschien nodig heeft.

Hier is mijn voorbeeld en onthoud dat dit mijn eerste antwoord is. Ik heb de param-array verwijderd omdat ik maar één specifieke array hoefde te doorzoeken, maar je kon hem gemakkelijk toevoegen. Ik wilde in wezen zoeken op meer dan alleen de uid.

In mijn situatie kunnen er ook meerdere sleutels zijn die moeten worden geretourneerd als resultaat van het zoeken op andere velden die mogelijk niet uniek zijn.

/**
     * @param array multidimensional 
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     * 
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }

Later heb ik dit uiteindelijk geschreven om me in staat te stellen naar een andere waarde en associatieve sleutel te zoeken. Dus in mijn eerste voorbeeld kun je zoeken naar een waarde in een specifieke associatieve sleutel en alle overeenkomsten retourneren.

Dit tweede voorbeeld laat zien waar een waarde (‘Taylor’) wordt gevonden in een bepaalde associatieve sleutel (first_name) ENeen andere waarde (true) wordt gevonden in een andere associatieve sleutel (werkzaam), en geeft alle overeenkomsten terug (sleutels waar mensen met de voornaam ‘Taylor’ EN in dienst zijn).

/**
 * @param array multidimensional 
 * @param string $search_value The value to search for, ie a specific 'Taylor'
 * @param string $key_to_search The associative key to find it in, ie first_name
 * @param string $other_matching_key The associative key to find in the matches for employed
 * @param string $other_matching_value The value to find in that matching associative key, ie true
 * 
 * @return array keys, ie all the people with the first name 'Taylor' that are employed.
 */
 function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) {
    // This function will search the revisions for a certain value
    // related to the associative key you are looking for.
    $keys = array();
    foreach ($dataArray as $key => $cur_value) {
        if ($cur_value[$key_to_search] == $search_value) {
            if (isset($other_matching_key) && isset($other_matching_value)) {
                if ($cur_value[$other_matching_key] == $other_matching_value) {
                    $keys[] = $key;
                }
            } else {
                // I must keep in mind that some searches may have multiple
                // matches and others would not, so leave it open with no continues.
                $keys[] = $key;
            }
        }
    }
    return $keys;
}

Gebruik van functie

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);
$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);

Resultaat

Array ( [0] => 2 ) 

Antwoord 6, autoriteit 2%

Het lijkt erop dat array_filterhiervoor een geschikte oplossing zal zijn…

$userdb=Array
(
    (0) => Array
        (
            (uid) => '100',
            (name) => 'Sandra Shush',
            (url) => 'urlof100'
        ),
    (1) => Array
        (
            (uid) => '5465',
            (name) => 'Stefanie Mcmohn',
            (pic_square) => 'urlof100'
        ),
    (2) => Array
        (
            (uid) => '40489',
            (name) => 'Michael',
            (pic_square) => 'urlof40489'
        )
);

PHP-code

<?php 
$search = 5465;
$found = array_filter($userdb,function($v,$k) use ($search){
  return $v['uid'] == $search;
},ARRAY_FILTER_USE_BOTH) // With latest PHP third parameter is mandatory.. Available Values:- ARRAY_FILTER_USE_BOTH OR ARRAY_FILTER_USE_KEY  
$values= print_r(array_values($found));
$keys =  print_r(array_keys($found)); 

Antwoord 7, autoriteit 2%

Ik heb een van de onderstaande voorbeelden van de functie array_searchaangepast. Functie searchItemsByKeyretourneert alle waarde(n) met $key uit multidimensionale array ( N niveaus). Misschien zou het nuttig zijn voor iemand. Voorbeeld:

$arr = array(
     'XXX'=>array(
               'YYY'=> array(
                    'AAA'=> array(
                          'keyN' =>'value1'
                   )
               ),
              'ZZZ'=> array(
                    'BBB'=> array(
                          'keyN' => 'value2'
                   )
               )
              //.....
           )
);
$result = searchItemsByKey($arr,'keyN');
print '<pre>';
print_r($result);
print '<pre>';
// OUTPUT
Array
(
  [0] => value1
  [1] => value2
)

Functiecode:

function searchItemsByKey($array, $key)
{
   $results = array();
  if (is_array($array))
  {
    if (isset($array[$key]) && key($array)==$key)
        $results[] = $array[$key];
    foreach ($array as $sub_array)
        $results = array_merge($results, searchItemsByKey($sub_array, $key));
  }
 return  $results;
}

Antwoord 8

Hier is één voering voor hetzelfde,

$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];

Antwoord 9

Daar kun je array_column voor gebruiken.

$search_value = '5465';
$search_key   = 'uid';
$user = array_search($search_value, array_column($userdb, $search_key));
print_r($userdb[$user]);

5465is de gebruikers-ID die u wilt zoeken, uidis de sleutel die de gebruikers-ID bevat en $userdbis de array die gedefinieerd in de vraag.


Antwoord 10

Ik wil controleren of in de volgende array $arrbestaat ‘abc’ in subarrays of niet

$arr = array(
    array(
        'title' => 'abc'
    )
);

Dan kan ik dit gebruiken

$res = array_search('abc', array_column($arr, 'title'));
if($res == ''){
    echo 'exists';
} else {
    echo 'notExists';
}

Ik denk dat dit de meest eenvoudige manier is om te definiëren


Antwoord 11

Hoewel dit een oude vraag is en een geaccepteerd antwoord heeft, dacht ik dat ik één wijziging in het geaccepteerde antwoord zou voorstellen. Dus ten eerste, ik ben het ermee eens dat het geaccepteerde antwoord hier correct is.

function searchArrayKeyVal($sKey, $id, $array) {
   foreach ($array as $key => $val) {
       if ($val[$sKey] == $id) {
           return $key;
       }
   }
   return false;
}

Vervanging van de vooraf ingestelde ‘UID’ met een parameter in de functie in plaats daarvan, zodat u nu de onderstaande code belt, betekent u dat u de ene functie in meerdere array-typen kunt gebruiken. Kleine verandering, maar een die het kleine verschil maakt.

   // Array Data Of Users
$userdb = array (
    array ('uid' => '100','name' => 'Sandra Shush','url' => 'urlof100' ),
    array ('uid' => '5465','name' => 'Stefanie Mcmohn','url' => 'urlof100' ),
    array ('uid' => '40489','name' => 'Michael','url' => 'urlof40489' ),
);
// Obtain The Key Of The Array
$arrayKey = searchArrayKeyVal("uid", '100', $userdb);
if ($arrayKey!==false) {
    echo "Search Result: ", $userdb[$arrayKey]['name'];
} else {
    echo "Search Result can not be found";
}

PHP Fiddle Voorbeeld


Antwoord 12

Ik moest de VN-functie gebruiken die elke elementen in een array vindt. Dus ik heb de functie aangepast door Jakub Truneček als volgt:

function search_in_array_r($needle, $array) {
    $found = array();
    foreach ($array as $key => $val) {
        if ($val[1] == $needle) {
            array_push($found, $val[1]);
        }
    }
    if (count($found) != 0)
        return $found;
    else
        return null;
}

Antwoord 13

/**
 * searches a simple as well as multi dimension array
 * @param type $needle
 * @param type $haystack
 * @return boolean
 */
public static function in_array_multi($needle, $haystack){
    $needle = trim($needle);
    if(!is_array($haystack))
        return False;
    foreach($haystack as $key=>$value){
        if(is_array($value)){
            if(self::in_array_multi($needle, $value))
                return True;
            else
               self::in_array_multi($needle, $value);
        }
        else
        if(trim($value) === trim($needle)){//visibility fix//
            error_log("$value === $needle setting visibility to 1 hidden");
            return True;
        }
    }
    return False;
}

Antwoord 14

U kunt deze functie gebruiken;
https://github.com/serhatozles/arrayadvancedsearch

<?php 
include('ArraySearch.php');
$query = "a='Example World' and b>='2'";
$Array = array(
'a' => array('d' => '2'),
array('a' => 'Example World','b' => '2'),
array('c' => '3'), array('d' => '4'),
);
$Result = ArraySearch($Array,$query,1);
echo '<pre>';
print_r($Result);
echo '</pre>'; 
// Output:
// Array
// (
//    [0] => Array
//        (
//            [a] => Example World
//            [b] => 2
//        )
//
// )

Antwoord 15

$a = ['x' => ['eee', 'ccc'], 'b' => ['zzz']];
$found = null;
$search = 'eee';
array_walk($a, function ($k, $v) use ($search, &$found) {
    if (in_array($search, $k)) {
        $found = $v;
    }
});
var_dump($found);

Antwoord 16

Probeer dit

<?php
 function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && 
            recursive_array_search($needle,$value) !== false)) {
             return $current_key;
        }
    }
    return false;
 }
 ?>

Antwoord 17

Gewoon delen, misschien mag je dit leuk vinden.

if( ! function_exists('arraySearchMulti')){
function arraySearchMulti($search,$key,$array,$returnKey=false)
{
    foreach ($array as $k => $val) {
        if (isset($val[$key])) {
            if ((string)$val[$key] == (string)$search) {
                return ($returnKey ? $k : $val);
            }
        }else{
            return (is_array($val) ? arraySearchMulti($search,$key,$val,$returnKey) : null);
        }
    }
    return null;
}}

Antwoord 18

for( $i =0; $i < sizeof($allUsers); $i++)
    {   
    $NEEDLE1='firstname';
    $NEEDLE2='emailAddress';
    $sterm='Tofind';
     if(isset($allUsers[$i][$NEEDLE1]) && isset($allUsers[$i][$NEEDLE2])
        {
            $Fname= $allUsers[$i][$NEEDLE1];
            $Lname= $allUsers[$i][$NEEDLE2];
            $pos1 = stripos($Fname, $sterm);
            $pos2=stripos($Lname, $sterm);//not case sensitive 
            if($pos1 !== false ||$pos2 !== false)
            {$resultsMatched[] =$allUsers[$i];}
            else
            {   continue;}              
        }
}
Print_r($resultsMatched); //will give array for matched values even partially matched

Met behulp van bovenstaande code kan men alle (gedeeltelijk overeenkomende) gegevens uit elke kolom in een 2D-array vinden, zodat het gebruikers-ID kan worden gevonden zoals vereist in kwestie.


Antwoord 19

Uitbreiding van de functie @mayhem die is gemaakt, dit voorbeeld zou meer een “fuzzy” zoekopdracht zijn voor het geval u slechts een deel (meest) van een zoekreeks wilt matchen:

function searchArrayKeyVal($sKey, $id, $array) {
    foreach ($array as $key => $val) {
        if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) !== false) {
            return $key;
        }
    }
         return false;
 }

De waarde in de array is bijvoorbeeld Welcome to New York! en je wilde het eerste exemplaar van alleen “New York!”


Antwoord 20

Als vraag bijv.

$a = [
     [
       "_id" => "5a96933414d48831a41901f2",
       "discount_amount" => 3.29,
       "discount_id" => "5a92656a14d488570c2c44a2",
     ],
     [
       "_id" => "5a9790fd14d48879cf16a9e8",
       "discount_amount" => 4.53,
       "discount_id" => "5a9265b914d488548513b122",
     ],
     [
       "_id" => "5a98083614d488191304b6c3",
       "discount_amount" => 15.24,
       "discount_id" => "5a92806a14d48858ff5c2ec3",
     ],
     [
       "_id" => "5a982a4914d48824721eafe3",
       "discount_amount" => 45.74,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
    [
       "_id" => "5a982a4914d48824721eafe55",
       "discount_amount" => 10.26,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
   ];

Antwoord:

function searchForId($id, $array) {
    $did=0;
    $dia=0;
   foreach ($array as $key => $val) {
       if ($val['discount_id'] === $id) {
           $dia +=$val['discount_amount'];
           $did++;
       }
   }
    if($dia != '') {
        echo $dia;
        var_dump($did);
    }
   return null;
};
print_r(searchForId('5a928ce414d488609e73b443',$a));

Antwoord 21

Niemand anders heeft array_reduce nog gebruikt, dus dacht ik deze aanpak toe te voegen…

$find_by_uid = '100';
$is_in_array = array_reduce($userdb, function($carry, $user) use ($find_by_uid){
    return $carry ? $carry : $user['uid'] === $find_by_uid;
}); 
// Returns true

Geeft u meer controle over de ‘zoek’-logica dan array_search().

Merk op dat ik hier strikte gelijkheid heb gebruikt, maar je zou kunnen kiezen voor een andere vergelijkingslogica. De $carry betekent dat de vergelijking één keer waar moet zijn, en het uiteindelijke resultaat zal WAAR zijn.


Antwoord 22

Hier is een betere oplossing voor het geval u gegevens uit een database of een multidimensionale array haalt

Voorbeeld van een multidimensionale array:

$records = array(
            array(
                'id' => 2135,
                'first_name' => 'John',
                'last_name' => 'Doe',
            ),
            array(
                'id' => 3245,
                'first_name' => 'Sally',
                'last_name' => 'Smith',
            ),
            array(
                'id' => 5342,
                'first_name' => 'Jane',
                'last_name' => 'Jones',
            ),
            array(
                'id' => 5623,
                'first_name' => 'Peter',
                'last_name' => 'Doe',
            )
            );
            function search_user_by_name($name, $array) {
                             foreach ($array as $keys) {
                                 foreach ($keys as $key => $_user_record) {
                                     if ($_user_record == $name) {
                                         return [$key => $_user_record];//Return and array of user
                                     }
                                 }
                             }
                             return null;
                        }

Bel de functie:

$results = search_user_by_name('John', $records);
         print_r($results);

Uitgang: Array ( [first_name] => John )

Other episodes