web-dev-qa-db-fra.com

PHP tableau multidimensionnel recherche par valeur

J'ai un tableau où je veux rechercher le uid et obtenir la clé du tableau.

Exemples

Supposons que nous ayons le tableau à 2 dimensions suivant:

$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'
    )
);

L'appel de fonction search_by_uid(100) (uid du premier utilisateur) doit renvoyer 0.

L'appel de fonction search_by_uid(40489) doit renvoyer 2.

J'ai essayé de faire des boucles, mais je veux un code d'exécution plus rapide.

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

Cela fonctionnera. Vous devriez l'appeler comme ça:

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

Il est important de savoir que si vous utilisez ===, les types comparés à l'opérateur doivent être exactement identiques, dans cet exemple, vous devez rechercher string ou simplement utiliser == à la place ===. .

Basé sur angor réponse. Dans les versions ultérieures de PHP (>= 5.5.0), vous pouvez utiliser une ligne.

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

Voici la documentation: http://php.net/manual/en/function.array-column.php .

407
Jakub Truneček

Si vous utilisez (PHP 5> = 5.5.0), vous n'avez pas à écrire votre propre fonction pour faire cela, écrivez simplement cette ligne et c'est fait.

Si vous voulez juste un résultat:

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

Pour des résultats multiples

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

Si vous avez un tableau associatif comme indiqué dans les commentaires, vous pouvez le créer avec:

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

Si vous utilisez PHP <5.5.0, vous pouvez utiliser ce backport , merci ramsey!

Mise à jour: Je fais quelques repères simples et le formulaire de résultats multiples semble être le plus rapide, encore plus rapide que la fonction personnalisée Jakub!

269
angoru

En s'appuyant sur l'excellente réponse de Jakub , voici une recherche plus générale qui permettra à la clé d'être spécifiée (pas seulement pour uid):

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

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

25
reflexiv

Je sais que la réponse à cette question a déjà été faite, mais je l'ai utilisée et étendue un peu plus dans mon code afin que vous n'ayez pas à chercher uniquement par le uid. Je souhaite simplement le partager avec quiconque aurait besoin de cette fonctionnalité.

Voici mon exemple et s'il vous plaît gardez à l'esprit ceci est ma première réponse. J'ai sorti le tableau param parce que je n'avais besoin que de rechercher un tableau spécifique, mais vous pouvez facilement l'ajouter. Je voulais essentiellement effectuer une recherche par plus que le uid.

De plus, dans mon cas, il peut y avoir plusieurs clés à retourner à la suite de recherches effectuées dans d'autres champs qui peuvent ne pas être uniques.

 /**
     * @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;
    }

Plus tard, j'ai fini par écrire ceci pour me permettre de rechercher une autre valeur et une clé associative. Mon premier exemple vous permet donc de rechercher une valeur dans une clé associative spécifique et de renvoyer toutes les correspondances.

Ce deuxième exemple vous montre où une valeur ('Taylor') se trouve dans une certaine clé associative (prénom_nom) ET une autre valeur (true) se trouve dans une autre clé associative (employée), et retourne toutes les correspondances (Clés dans lesquelles les personnes portant le prénom 'Taylor' ET sont employées).

/**
 * @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;
}

tilisation de la fonction

$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);

Résultat

Array ( [0] => 2 ) 
19
amurrell

Dans les versions ultérieures de PHP (> = 5.5.0), vous pouvez utiliser ce one-liner:

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

J'ai modifié l'un des exemples ci-dessous la fonction de description array_search . La fonction searchItemsByKey renvoie toutes les valeurs par la clé $ du tableau multidimensionnel (N niveaux). Peut-être que ce serait utile pour quelqu'un. Exemple:

 $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
)

Code de fonction:

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;
}
8
voodoo417

Looks array_filter sera une solution appropriée pour cela ...

$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'
        )
);

Code PHP

<?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_value($found)); 
$keys =  print_r(array_keys($found)); 
5
BEJGAM SHIVA PRASAD

Voici une doublure pour la même chose,

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

Même si cette question est ancienne et a une réponse acceptée, je pensais que je proposerais un changement à la réponse acceptée. Alors, pour commencer, je conviens que la réponse acceptée est correcte ici.

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

En remplaçant le préréglage 'uid' par un paramètre dans la fonction, appeler le code ci-dessous signifie donc que vous pouvez utiliser la fonction unique pour plusieurs types de tableaux. Petit changement, mais qui fait la légère différence.

    // 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 Exemple

3
Angry 84
$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);
1
serghei

Essaye ça

<?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;
 }
 ?>
1
Maurizio Ricci

Je devais utiliser une fonction qui trouve tous les éléments d'un tableau. J'ai donc modifié la fonction de Jakub Truneček comme suit:

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;
}
1
csi_bern

Je veux vérifier que dans le tableau suivant $arr est-ce que 'abc' existe dans les sous-tableaux ou non

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

Ensuite, je peux utiliser cette

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

Je pense que ceci est le moyen le plus simple de définir

1
M.suleman Khan
/**
 * 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;
}
1
Ahad Ali

Juste partager, peut peut-être comme ça.

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;
}}
1
Whendy Takashy

vous pouvez utiliser cette fonction; 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
//        )
//
// )
1
Serhat
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

Avec l'aide du code ci-dessus, il est possible de trouver toutes les données (partiellement appariées) de n'importe quelle colonne d'un tableau 2D, de sorte que l'ID utilisateur puisse être trouvé comme il convient dans la question.

0
sandeep sharma

En développant la fonction créée par @mayhem, cet exemple serait davantage une recherche "floue" au cas où vous souhaiteriez faire correspondre une partie (la plupart) d'une chaîne de recherche:

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

Par exemple, la valeur du tableau est Welcome to New York! et vous vouliez la première instance de "New York!"

0
Mike Q

Essayez ceci aussi

function search_in_array($srchvalue, $array)
{
    if (is_array($array) && count($array) > 0)
    {
        $foundkey = array_search($srchvalue, $array);
        if ($foundkey === FALSE)
        {
            foreach ($array as $key => $value)
            {
                if (is_array($value) && count($value) > 0)
                {
                    $foundkey = search_in_array($srchvalue, $value);
                    if ($foundkey != FALSE)
                        return $foundkey;
                }
            }
        }
        else
            return $foundkey;
    }
}
0
PravinS

ma solution:

function searchArrayForField($array, $field, $value) {
    $i = 0;
    foreach ($array as &$row) {
        if ($row[$field] === $value) {
            return $i;
        }
        $i++
    }
    return '';
}
0
costamatrix
$search1 = 'demo';
$search2 = 'bob';
$arr = array('0' => 'hello','1' => 'test','2' => 'john','3' => array('0' => 'martin', '1' => 'bob'),'4' => 'demo');
foreach ($arr as $value) { 
    if (is_array($value)) { 
        if (in_array($search2, $value)) { 
            echo "successsfully";    
            //execute your code 
        }
    } else {  
        if ($value == $search1) { 
            echo "success";
        }
    }
 }
0
Bhavyesh

Si question i.e.

$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",
     ],
   ];

Ans:

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));
0