2016-04-13 10 views
5

Ho un array che assomiglia a questo:Ottieni un valore di matrice specifico in cui un altro valore è "1"?

Id = "ADA001" 
    Stock: 15 

L'array ha circa 1700 record che sembra la stessa, come faccio a cercare la matrice per l'ID 1 e restituire il magazzino?

Edit: Ho bisogno di accedere al magazzino di ognuno di questi 17000 record

Edit: Sono stato sempre un po 'di aiuto da parte di Daniel Centore, mi ha detto di impostare una chiave primaria per gli array l'id dell'articolo e che è uguale allo stock, ma non riesco a farlo funzionare.

Attualmente sto ricevendo i dati da un database MySQL e devo conservare in un array, in questo modo:

 $data[] = array(); 
    $getdisposabletest = mysqli_query($connect, "Select id, disposable FROM products");  

while ($z = mysqli_fetch_array($getdisposabletest)) { 
    $data = $z; 
} 

Ora, quando io uso il codice Daniels che assomiglia a questo:

$myMap = []; 
foreach($data as $item) { 
    $myMap[$item['id']] = $item['disposable']; 
} 

esso non restituisce nulla quando cerco di eco il mio prodotto con l'ID "ADA001"

echo $myMap["ADA001"]; 

anche quando faccio "count ($ mymap)" dice che i suoi 2 record sono grandi, quando dovrebbe essere molto più grande di così?

Grazie per l'aiuto

+0

condividerei un po 'di più la struttura dell'array –

+0

Se gli ID sono univoci, allora avrà senso nel lungo periodo che l'array venga indicizzato basandosi su di essi, oltre a risolvere questo particolare problema. – iainn

+0

Usa 'array_filter (...)' http://php.net/manual/en/function.array-filter.php, e se sei sicuro che gli ID sono unici, usa 'current (array_filter (...)) 'per restituire il primo record. – Anton

risposta

0

Si farebbe qualcosa di simile.

$newArray=[]; 
foreach($array as $item){ 
    if($item['Id'] === 1){ 
     $newArray[] = $item; 
    } 
} 
$stockArray = array_column($newArray,'Stock'); 
+0

Utilizzerei sicuramente '===' se si esegue il test per 1 o 0. – DevDonkey

+0

Non so se 1 sia una stringa o un intero – Neoaptt

+1

per un array di 1700 voci Suggerirei di rendere l'id una chiave per l'array –

3

Vorrei utilizzare array_filter. Restituisce il risultato di un comparatore.

$results = array_filter($targetArray, function($el) { 
    return $el === 1; 
}); 
1

Edit: Ora che è stato chiarito che il PO vuole interrogare da migliaia di articoli, il modo corretto per farlo è quello di rendere la Id la chiave per una mappa in PHP, come questo :

$myMap = []; 
foreach($array as $item) { 
    $myMap[$item['Id']] = $item['Stock']; 
} 

Ora, ogni volta che si desidera accedere voce '12', è sufficiente utilizzare $myMap['12'].

Il motivo per cui questo è più veloce è a causa di qualcosa chiamata complessità algoritmica. Dovresti leggere la notazione Big-O per maggiori informazioni. Essenzialmente, la prima operazione qui è nell'ordine di n e quindi il looping di ciascuno degli elementi che escono è nell'ordine di n*log(n), quindi il risultato finale è nell'ordine di n*log(n) che è il migliore che sarete in grado di fare senza ulteriori informazioni. Tuttavia, se si stesse solo accedendo a un elemento, l'accesso a quell'elemento tramite MySQL sarebbe meglio perché sarebbe nell'ordine di log(n), che è più veloce.

Edit 2: Si noti inoltre che se si dovesse accedere mutliple campi (cioè non solo il magazzino) è possibile effettuare le seguenti operazioni:

$myMap = []; 
foreach($array as $item) { 
    $myMap[$item['Id']] = $item; 
} 

E semplicemente l'accesso al punto 12 del titolo come questo: $myMap['12']['stock'] o il suo nome in questo modo: $myMap['12']['name'].

+0

Sì, hai ragione sul fatto che sto ricevendo gli oggetti da un tavolo, ma il mio sistema è molto più complesso di questo e quello che sto cercando di risolvere in questo momento è solo una piccola parte del mio sistema. – user2750279

+0

In questo modo è ancora più efficiente se diciamo che ho 2000 prodotti e ho bisogno di ottenere il magazzino di ogni articolo? L'interrogazione del database ripetutamente sarebbe così efficace? – user2750279

+0

No, non sarebbe più efficiente. Metti in chiaro che questo è quello che vuoi fare nella domanda e aggiornerò la mia risposta con quella corretta. –

Problemi correlati