Array PHP Analisi

Ciao a tutti, ho una vasta gamma di tornare come risultati di ricerca, e voglio fare le seguenti cose:

Piedi attraverso l’array e per ogni record con la stessa “spubid” aggiungere le seguenti chiavi/vals: “sfirst, smi, slast” al genitore membro dell’array, in questo caso, $a[0]. In modo che il risultato sarebbe lasciare $a[0] intatti, ma aggiungere ad essa, i valori sfirst, smi e slast dagli altri membri dell’array (dato che tutti hanno la stessa “spubid”). Penso che aggiungendo il valore della chiave (1, 2, 3), associato (tasto sfirst1=> “J.”, smi1=>”F”, slast1=>”Kennedy”) andrebbe bene. Vorrei, poi, in DISCESA (unset()) il resto dei membri dell’array con che “spubid”. Qui è un esempio semplificato di matrice sto ottenendo di nuovo e in questo esempio tutti i record che hanno lo stesso “spubid”:

Array ( 
  [0] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => J. 
      [smi] => A. 
      [slast] => Doe
  [1] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => J. 
      [smi] => F. 
      [slast] => Kennedy 
  [2] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => B. 
      [smi] => F. 
      [slast] => James 
  [3] => 
    Array ( 
      [spubid] => A00502
      [sfirst] => S. 
      [smi] => M. 
      [slast] => Williamson 
      )
    )

Quindi, in sostanza io voglio continuare a $a[0], ma aggiungere nuove chiavi=>valori (sfirst$chiave, smi$chiave, slast$key) e aggiungere i valori da “sfirst, smi, slast” da TUTTI i membri con la stessa “spubid” quindi unset $a[1]-[3].

Solo per chiarire il mio IDEALE risultato finale sarebbe:

Array ( 
  [0] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => J. 
      [smi] => A. 
      [slast] => Doe
      [sfirst1] => J.
      [smi1] => F. 
      [slast1] => Kennedy
      [sfirst2] => B. 
      [smi2] => F. 
      [slast2] => James 
      [sfirst3] => S. 
      [smi3] => M. 
      [slast3] => Williamson
    )
  )

Nella maggior parte dei casi, avrò una molto più grande array di iniziare con che comprende una moltitudine di “spubid”‘s, ma il 99% delle pubblicazioni con più autori, in modo tale routine sarebbe molto utile nella pulizia di risultati e rendendo il processo di analisi per la visualizzazione molto più facile.

***AGGIORNAMENTO

Penso che oltre a semplificare il mio esempio forse ho fatto cose poco chiare. Mi piace sia Chacha102 e zombat le risposte, ma il mio “padre array” contiene MOLTO di più di un pubid, che sembra appena essere la chiave primaria. Ho bisogno di mantenere un sacco di dati da registrare, una piccola parte di che è il seguente:

[spubid] => A00680 
[bactive] => t 
[bbatch_import] => t 
[bincomplete] => t 
[scitation_vis] => I,X 
[dentered] => 2009-08-03 12:34:14.82103 
[sentered_by] => pubs_batchadd.php 
[drev] => 2009-08-03 12:34:14.82103 
[srev_by] => pubs_batchadd.php 
[bpeer_reviewed] => t 
[sarticle] => A case study of bora-driven flow and density changes on the Adriatic shelf (January 1987)
.
.
.
.
.

Ci sono circa 40 colonne che ritornano con ogni query di ricerca. Piuttosto che duro la programmazione come questi esempi che fare con il pubid, come faccio a inserire il loro, mentre ancora a fare le modifiche, come si sia suggerito. Creazione di un array multi-dimensionale (sia come voi suggerito) con gli autori di essere parte di una multi-dimensione è perfettamente bene, grazie ad entrambi per il suggerimento.

**** AGGIORNAMENTO:

Qui è che cosa ho optato per una soluzione molto semplice e ottiene il lavoro fatto bene. Faccio finire la creazione di un array multidimensionale, così gli autori sono rotto là fuori.

Oltre semplificato soluzione:

$apubs_final = array();
$spubid = NULL;
$ipub = 0;

foreach($apubs as $arec)
{
  if($spubid != $arec['spubid'])
  {
    $ipub++;
    $apubs_final[$ipub] = $arec;
    //insert UNSET statements here for author data
    $iauthor = 0;
    $spubid = $arec['spubid'];
  }
  $iauthor++;
  $apubs_final[$ipub]['authors'][$iauthor]['sauthor_first'] = $arec['sfirst'];
} 

Grazie a tutti quelli che hanno risposto, il tuo aiuto è molto apprezzato!

  • Questo è uno difficile.
  • Potrebbe essere più facile per ottenere un array di autore matrici, ciascuna contenente sfirst, smi e slast?
  • Lì, l’ho fatto in entrambi i modi per voi la mia risposta in caso si sono aperti per il passaggio a un diverso formato.
  • C’, sono state apportate modifiche.
  • Cosa fare con la matrice si finisce con? Perché è necessario essere in che formato?
  • La notazione ungherese rende i miei occhi sanguinano.
  • rojoca: Il formato che ho suggerito che sarebbe stato facile, per analizzare come il formato $a[‘spubid’][‘autori’][sfirst] … ho solo bisogno di legare completo elenco autore per singolo pubid. I risultati sono di ritorno da un nidificati SQL JOIN quindi il grande prodotto.
  • Nicola, ha fatto la mia aggiornati ottenere risposta vuoi che ti serviva?



3 Replies
  1. 3
    //First, probably the more parsable way.
    foreach($array as $key => $values)
    {
        $end[$spuid] = $values;
        $spuid = $values['spuid']
        $end[$spuid]['authors'][] = array('sfirst' => $values['sfirst'],
                              'smi' => $values['smi'],
                               'slast' => $values['slast']);
    
    }

    Che consentirà di ottenere un array come questo

    Array(
        [A00502] =>
             Array(
               [supid] => A00502
                   .... other values .....
               [authors] =>
                     Array(
                    [0]=>
                          Array(
                        ['sfirst'] => '',
                        ['smi'] => '',
                        ['slast'] => '')
                    )
            )
    )

    Trovo che questo modo di essere molto di più di analisi in grado, se avete intenzione di mostrare in una pagina, perché utilizza l’array in modo che si può foreach gli autori, che è come ho visto molte persone fare per gli attributi come che.

    Se davvero si desidera che il formato ideale, utilizzare questo poi

    $count = 0;
    foreach ($end as $supid => $values)
    {
        $other_end[$count] = $values;
        $other_end[$count]['spuid'] = $spuid;
        foreach($values['authors'] as $key => $author)
        {
            if($key == 0)
            {
                $suffix = '';
            }
            else
            {
                $suffix = $key;
            }
            $other_end[$count]['sfirst'.$suffix] = $author['sfirst'];
            $other_end[$count]['smi'.$suffix] = $author['smi'];
            $other_end[$count]['slast'.$suffix] = $author['slast'];
        }
    
    }
    • Ottima soluzione, ho modificato il post originale perché ho un po ‘ più semplificato le cose rendendo la mia domanda poco chiara. Mi scuso!
    • Aggiornato, è molto simile, e si potrebbe avere un paio di tasti, ma sarà tutto lì.
    • Fondamentalmente, si avrà l’extra prima metà e l’ultimo nome dell’ultima persona che nella matrice, ma che non dovrebbero influire più di tanto.
    • Aggiornato soluzione mi ha portato dove dovevo arrivare, ho modificato il mio post originale, con la soluzione che ho trovato. La ringrazio ancora MOLTO per tutto.
    • Sapete tutti che hanno risposto a questa è in attesa di vedere che si danno accettato di rispondere. 😛
    • Molto simile a quello che ho finito di stabilirsi su, il tuo approccio mi ha dato l’idea di arrivare dove dovevo andare. Grazie ancora Chacha102. La mia soluzione è stato aggiunto al mio post originale, nel 2 ° modifica.

  2. 2

    Perché invece non fare un array calettati sull’spubid:

    //assuming $array is your array:
    
    $storage = array();
    foreach($array as $entry) {
      $bid = $entry['spubid'];
      if (!isset($storage[$bid])) {
        //duplicate entry - taking the author out of it.
        $stortmp = $entry;
        unset($stortmp['sfirst'], $stortmp['smi'], $stortmp['slast']);
        //add an authors array
        $stortmp['authors'] = array();
        $storage[$bid] = $stortmp;
      }
      $author = array(
        'sfirst' => $entry['sfirst'], 
        'smi' => $entry['smi'], 
        'slast' => $entry['slast']);
      $storage[$bid]['authors'][] = $author;
    }

    Ora il tuo $array di storage dovrebbe assomigliare a questo:

    Array(
      "A00502" => Array(
        "spubid" => "A00502",
        "authors" => Array(
          [0] => 
            Array ( 
              [sfirst] => J. 
              [smi] => A. 
              [slast] => Doe
           [1] => 
             Array ( 
              [sfirst] => J. 
              [smi] => F. 
              [slast] => Kennedy

    E si può facilmente fare un foreach degli autori stampa:

    foreach ($storage as $pub) {
      echo 'Pub ID: '.$pub['spubid']."<br/>";
      foreach ($pub['authors'] as $author) {
        echo 'Author: '.$author['sfirst'].' '.$author['smi'].' '.$author['slast']."<br/>";
      }
    }

    E come bonus aggiuntivo, è possibile accedere $storage['A00502'].

    AGGIORNAMENTO PER IL COMMENTO

    Sembra che il tuo array è probabilmente provenienti da qualche tipo di query SQL che coinvolge un JOIN pubblicazioni tabella authors. Questo sta facendo il risultato del set di dati duplicati un sacco di informazioni che non si ha realmente bisogno di. Non c’è nessun motivo per avere tutte le pubblicazione dei dati trasferiti/recuperati dal database più volte. Provare a riscrivere per ottenere una query di tutti i libri la sua intenzione di display, quindi hanno un “autori” query che fa qualcosa di simile:

    SELECT * FROM authors WHERE spubid IN ('A00502', 'A00503', 'A00504');

    Poi convertirlo in questa matrice da utilizzare per i vostri scopi di visualizzazione. Il database dei livelli di traffico vi ringrazio.

    • Questo non funziona come previsto, io sono ancora la realizzazione di sopra di tutti i dati duplicati. Ho semplificato al massimo il mio esempio nel post originale che, sono sicuro, è stato fuorviante. Ho ampliato l’esempio.
    • Ho modificato l’esempio per mostrare come mantenere tutti i dati, ma mi fa pensare il tuo problema è più circa il vostro set di dati. C’è una sezione alla fine della risposta su questo.
    • Questo è stato il mio primo approccio, utilizzando una query per ottenere tutti i pub info e una separata per afferrare gli autori. i personalmente piace questo approccio migliore quando si sta interrogando il database per esattamente i dati che avete bisogno di. Mi è stato però detto da un potere che non posso usare questo metodo e fare tutto con una sola query. Da qui la NIDIFICATO unisce…
  3. 1

    Questo codice dovrebbe funzionare esattamente come specificato. Ho preso l’approccio di utilizzo di una coppia di array temporanei di fare correlazioni tra le principali chiavi dell’array e il spubid sub-chiavi.

    /* assume $array is the main array */
    $array = array(
        array('spubid' => 'A00502','sfirst'=>'J.','smi'=>'A.','slast'=>'Doe'),
        array('spubid' => 'A00502','sfirst'=>'J.','smi'=>'F.','slast'=>'Kennedy'),
        array('spubid' => 'A00502','sfirst'=>'B.','smi'=>'F.','slast'=>'James'),
        array('spubid' => 'BXXXXX','sfirst'=>'B.','smi'=>'F.','slast'=>'James'),
        array('spubid' => 'A00502','sfirst'=>'S.','smi'=>'M.','slast'=>'Williamson')
    );
    
    //track spubid positions in the main array
    $keyPositions = array();
    //keys to delete after array iteration
    $keyDel = array();
    //track how many spubkey increments you've made to the fields
    $spubKeys = array();
    //fields to copy between spubids
    $copyFields = array('sfirst','smi','slast');
    
    foreach($array as $key => $subarr)
    {
        if (isset($subarr['spubid'])) {
            if (isset($keyPositions[$subarr['spubid']])) {
                //spubid already exists at a main array key, do the copy
                $spubKey = ++$spubKeys[$subarr['spubid']];
                foreach($copyFields as $f) {
                    $array[$keyPositions[$subarr['spubid']]][$f.$spubKey] = $subarr[$f];
                }
                $keyDel[] = $key;
            }
            else {
                //First time encountering this spubid, mark the position
                $keyPositions[$subarr['spubid']] = $key;
                $spubKeys[$subarr['spubid']] = 0;
            }
        }
    }
    if (count($keyDel)) {
        foreach($keyDel as $idx) unset($array[$idx]);
    }
    
    var_dump($array);
    • Modificato il post originale a causa di qualche eccessiva semplificazione dei dati in questione. Si potrebbe prendere un altro sguardo? Grazie ancora per il grande soluzione.

Lascia un commento