J'ai un tableau où je veux rechercher le uid
et obtenir la clé du tableau.
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.
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 .
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!
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);
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 )
Dans les versions ultérieures de PHP (> = 5.5.0), vous pouvez utiliser ce one-liner:
$key = array_search('100', array_column($userdb, 'uid'));
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;
}
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));
Voici une doublure pour la même chose,
$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];
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";
}
$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);
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;
}
?>
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;
}
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
/**
* 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;
}
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;
}}
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
// )
//
// )
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.
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!"
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;
}
}
ma solution:
function searchArrayForField($array, $field, $value) {
$i = 0;
foreach ($array as &$row) {
if ($row[$field] === $value) {
return $i;
}
$i++
}
return '';
}
$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";
}
}
}
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));