Référence tableau PHP par plusieurs index
Ce peut-être une sorte de bizarre plus de raccourci, et s'il vous plaît corrigez-moi si je me trompe dans ce train de pensée...
J'ai une matrice de données qui ressemble à:
unique_id | url | other random data...
unique_id | url | other random data...
unique_id | url | other random data...
Je veux être en mesure de faire référence à un élément en soit c'est de l'url, ou c'est unique_id - est-il une façon élégante de faire cela?
Je suppose que la tricherie solution serait de faire deux tableaux, mais je me demandais si il ya une meilleure façon.
Non, pas vraiment. Il suffit de faire deux tableaux. La surcharge est minime (bien, selon la taille de vos tableaux sont).
Avez-vous besoin de modifier les "données aléatoires" une fois dans la matrice? Et est-il possible pour un unique_id et une URL à entrer en collision?
Ils doivent toujours être unique
Avez-vous besoin de modifier les "données aléatoires" une fois dans la matrice? Et est-il possible pour un unique_id et une URL à entrer en collision?
Ils doivent toujours être unique
OriginalL'auteur Jane Panda | 2010-12-10
Vous devez vous connecter pour publier un commentaire.
Essayer quelque chose comme cela:
non, il n'y a aucun moyen d'avoir plusieurs index pour les tableaux.
En règle générale, non. L'approche plus rapide (temps d'accès) est d'avoir deux tableaux, l'un avec le unique_id comme la clé, l'autre avec l'URL, et à la fois avec toutes les données de la valeur. Jacob réponse va utiliser un peu moins de mémoire, mais à itérer l'ensemble du tableau à chaque fois que vous faites référence à quelque chose; mon approche va utiliser un peu plus de mémoire, mais permettra de récupérer les résultats plus rapidement.
C'est une honte... je pense juste itération, il n'est pas si mal
OriginalL'auteur Jacob Relkin
Seule façon que je peux penser qui n'implique pas de l'itération le tableau pour chaque recherche (voir Jacob réponse) est de stocker les références de chaque élément dans les deux tableaux.
Modifier: Que les Url et les Id ne peut pas entrer en collision, ils peuvent être stockés dans la même référence, array (merci Matthieu)
Vous pourriez probablement encapsuler ce bien à l'aide d'une collection de classe qui implémente
getById()
etgetByUrl()
. En interne, il peut stocker les références en autant de tableaux que nécessaire.Bien sûr, ce que vous êtes essentiellement en train de faire ici est de créer de la indexé ensembles de résultats, quelque chose de meilleur à gauche à la base de données de gestion des systèmes.
$items
) si vous le souhaitez. Il pourrait être quelque peu à confusion, mais Bob dit les touches peuvent pas entrer en collision.C'est vrai, je vais modifier ma réponse en conséquence
Oh, c'est intéressant. Ils n'entrent pas en collision, mais il semble un peu effrayant, à partir d'une vulnérabilité d'un point de vue (par exemple, une recherche qui a été forcée à l'aide d'une url au lieu d'un unique_id). Belle technique mais
Il est similaire à lorsque vous récupérez des enregistrements de base de données à l'aide d'un
fetch_both
méthode où le résultat contient à la fois numérique et index de chaînes de caractères. En parlant de l'index, si ces données proviennent de la base de données, vous êtes probablement mieux d'appliquer des index pour les ID et les champs url et faire unique récupère pour récupérer nommé enregistrements.OriginalL'auteur Phil
Il semble que votre fantaisie solution n'a été disponible qu' PHP 5.5.
Vous pouvez combiner l'utilisation de array_search et array_column chercher votre entrée sur une seule ligne de code:
OriginalL'auteur Pierre Roudaut
Sûrement un objet serait le moyen le plus facile?
À utiliser avec
Cette technique a un peu plus de frais généraux en raison de la création de l'objet, mais à moins que vous êtes en train de faire un fou le nombre de lignes ce serait bien.
OriginalL'auteur Jon Story