2015-09-22 14 views
6

Sono un po 'arrugginito con php come capita che a volte lo uso da settimane e a volte capita che non lo usi da mesi. Ad ogni modo sto cercando di passare i valori di un altro array sono "array", su un altro array in modo ordinato ... Quello che voglio fare è essenzialmente creare una chiave che mi permetta di organizzare i valori incrementali per linea, in particolare;Come usare array_push con array associativo e chiave indice?

contenuto matrice

Array 
(
    [key] => value 
    [2] => 1 
    [3] => Inter 
    [4] => 4 
    [5] => 4 
    [6] => 0 
    [7] => 0 
    [8] => 5 
    [9] => 1 
    [10] => +4 
    [11] => 12 
    [12] => Chievo Verona - Inter 0 - 1 
    [13] => Inter - Milan 1 - 0 
    [14] => Carpi - Inter 1 - 2 
    [15] => Inter - Atalanta 1 - 0 
    [16] => ; 
    [17] => 2 
    [18] => Torino 
    [19] => 4 
    [20] => 3 
    [21] => 1 
    [22] => 0 
    [23] => 9 
    [24] => 4 
    [25] => +5 
    [26] => 10 
    [27] => Torino - Sampdoria 2 - 0 
    [28] => Hellas Verona - Torino 2 - 2 
    [29] => Torino - Fiorentina 3 - 1 
    [30] => Frosinone - Torino 1 - 2 
    [31] => ; 
    [32] => 3 
    [33] => Fiorentina 
    [34] => 4 
    [35] => 3 
    [36] => 0 
    [37] => 1 
    [38] => 5 
    [39] => 3 
    [40] => +2 
    [41] => 9 
    [42] => Carpi - Fiorentina 0 - 1 
    [43] => Fiorentina - Genoa 1 - 0 
    [44] => Torino - Fiorentina 3 - 1 
    [45] => Fiorentina - Milan 2 - 0 
    [46] => ; 
    [47] => 4 
    [48] => Roma 
    [49] => 4 
    [50] => 2 

il ";" Dovrà essere in grado di riconoscere dove si interrompe la linea, non ricordo se esiste un metodo che mi permetta di accedere alla prossima chiave.

Attualmente il mio codice è:

$classifica = array("key" => "value"); 
function buildArrayClassifica() 
{ 
    global $array; 
    global $classifica; 

    $i = 0; 

    foreach(array_slice($array,1) as $key => $value) 
    { 
     if($value != ";") 
     { 
      array_push($classifica[$i], $value); //there is a problem 
      echo $value . " "; 
     } 
     else if($value == "value ") 
     { 
      continue; 
     } 
     else 
     { 
      $i++;   
      echo "<br/>"; 
     } 
    } 
} 

Il codice Tornerò questo errore:

Warning: array_push() Expects parameter 1 to be array, null given in...

in particolare sulla array_push, sembra non accettare le chiavi incrementali o forse lo sto facendo la strada sbagliata. Qualcuno può dirmi come risolvere?

AGGIORNAMENTO

Come avete visto il problema non è semplice ed è abbastanza difficile da spiegare il problema, ma cercherò di essere ancora più chiaro di incontrare. Come puoi vedere sopra, sei la struttura dell'array "array", ma è una struttura disordinata che deve essere ordinata in un array addizionale. Per ricapitolare la struttura dell'array "array" è:

1 , Inter , 4 , 4 , 0 , 0 , 5 , 1 , +4 , 12 , Chievo Verona - Inter 0 - 1 , Inter - Milan 1 - 0 , Carpi - Inter 1 - 2 , Inter - Atalanta 1 - 0 , ; 

";" significa che la linea è finita. Quindi il prossimo valore vicino al ";" significa che verrà una nuova linea. Ho bisogno di spostare tutto il valore di "array" in ordine classifica, ma voglio organizzarle per:

ROW1 => 1 , Inter , 4 , 4 , 0 , 0 , 5 , 1 , +4 , 12 , Chievo Verona - Inter 0 - 1 , Inter - Milan 1 - 0 , Carpi - Inter 1 - 2 , Inter - Atalanta 1 - 0 
ROW2 => Other values... 

Così il ROW1, 2 .. rapresents la chiave dell'array classifica. Sto cercando di spingere il valore all'interno di una riga e dopo di esso incrementare $ i index ma il codice non aggiunge il valore perché l'indice sostituire in loop la chiave attuale, ad esempio:

actual foreach content: 
$i = 0 
value = "Inter" 
content of array=> [0] => Inter 
now the $i is ever 0 because the row isn't finished yet, the ";" 
it has not yet been reached, so the next content of foreach is: 
"1" but replace the "Inter" value, so this is a problem. 
+1

Se si utilizza un array associativo si aggiunge semplicemente la coppia chiave => valore all'array ex: $ myArray [$ myKey] = $ myValue; Il push su un array indicizzato è inutile poiché è già indicizzato dal tasto –

+0

Forse ho capito male, ma array_push mostra lo stesso errore: array_push ($ classifica [$ i] = $ valore); // Attenzione: array_push() si aspetta almeno 2 parametri – Bender

+1

Bender, sbarazzarsi di array_push, il codice dovrebbe essere solo $ classifica [$ i] = $ valore; –

risposta

3

Non è possibile utilizzare array_push() in questo modo. Si prega di provare:

$classifica = array(); 
function buildArrayClassifica() 
{ 
    global $array; 
    global $classifica; 

    $i = 0; 

    foreach(array_slice($array,1) as $key => $value) 
    { 
     if($value != ";") 
     { 
      $classifica[$i] = $value; 
      echo $value . " "; 
     } 
     else if($value == "value ") 
     { 
      continue; 
     } 
     else 
     { 
      $i++;   
      echo "<br/>"; 
     } 
    } 
} 

Questo creerà indici (il valore di $i) quando $value si aggiunge l'array. array_push() posizionerebbe il $value al prossimo indice numerico e potrebbe non essere quello che vuoi dal suo aspetto. Puoi anche usare $key se vuoi che l'indice corrisponda.

EDIT

Dopo più discussione, si dispone di un formato specifico, in cui il primo elemento è la chiave, i seguenti indici sono valori, e quando si incontra il valore ";", si avvia la sequenza sopra .Così, quando leggiamo:

[2] => 1 
[3] => Inter 
[4] => 4 
[5] => 4 
[6] => 0 
[7] => 0 
[8] => 5 
[9] => 1 
[10] => +4 
[11] => 12 
[12] => Chievo Verona - Inter 0 - 1 
[13] => Inter - Milan 1 - 0 
[14] => Carpi - Inter 1 - 2 
[15] => Inter - Atalanta 1 - 0 
[16] => ; 

Il primo valore, '1' è il nostro indice, i seguenti valori diventano il valore di questo indice, e ci fermiamo a leggere quando troviamo ";". Sarebbe come:

<?php 
function buildArrayClassifica($dataArray){ 
    $resultArray = array(); 
    $t = array_values($dataArray); 
    print_r($t); 
    $lsc = 0; 
    foreach($t as $k => $v){ 
     if((string)$v == ';'){ 
      echo "<p>Found ';' at [$k] => {$v}</p>"; 
      // Found end of data 
      // Save position 
      $scp = $k; 
      echo "<p>Recorded [$scp] position for ';'.</p>"; 
      // Reset to find the Index, first int in this series 
      $c=$lsc; // First pass this should be 0 
      // Set the index 
      if($lsc ==0){ 
       // First pass 
       $index = intval($t[$c]); 
       echo "<p>Getting Index from position [" . ($c) ."] => $index for Result Array.</p>"; 
       $c++; 
      } else { 
       $c++; 
       $index = intval($t[$c]); 
       echo "<p>Getting Index from position [" . ($c) ."] => $index for Result Array.</p>"; 
       $c++; 
      } 
      echo "<p>Starting to read data from [$c] until [$scp].</p>"; 
      // Init implode variable 
      $data = ""; 
      for($c;$c<$scp;$c++){ 
       //Populate variable with the series up to semicolon, skipping first element (index) 
       $data .= $t[$c] . ", "; 
      } 
      echo "<p>Data collected for this round: '" . htmlentities(substr($data,0,-2)) . "'</p>"; 
      // populate result array 
      $resultArray[$index] = substr($data,0,-2); 
      echo "<p>resultArray[$index] => " . htmlentities($resultArray[$index]) . "</p><br />"; 
      $lsc = $scp; 
     } 
    } 

    return $resultArray; 
} 
$oldArray = array(1, "Inter", 4 , 4 , 0 , 0 , 5 , 1 , "+4" , 12 , "Chievo Verona - Inter 0 - 1", "Inter - Milan 1 - 0", "Carpi - Inter 1 - 2", "Inter - Atalanta 1 - 0", ";", 2, "Torino", 4, 3, 1, 0, 9, 4, '+5', 10, "Torino - Sampdoria 2 - 0", "Hellas Verona - Torino 2 - 2", "Torino - Fiorentina 3 - 1", "Frosinone - Torino 1 - 2", ";", 3, "apple", 0, 4, 6, "apple", ";"); 

$classifica = buildArrayClassifica($oldArray); 
print_r($classifica); 
?> 

Il mio test iniziale sembra funzionare per quello che hai descritto. Il primo elemento dell'array diventa l'indice, i successivi valori diventano implosi fino a raggiungere il punto e virgola (;).

Quello che vedo come un risultato:

Array ([1] => Inter, 4, 4, 0, 0, 5, 1, +4, 12, Chievo Verona - Inter 0 - 1, Inter - Milan 1 - 0, Carpi - Inter 1 - 2, Inter - Atalanta 1 - 0 [2] => Torino, 4, 3, 1, 0, 9, 4, +5, 10, Torino - Sampdoria 2 - 0, Hellas Verona - Torino 2 - 2, Torino - Fiorentina 3 - 1, Frosinone - Torino 1 - 2 [3] => apple, 0, 4, 6, apple) 

PARTE

Se si trattasse di me, mi spingerebbe il tutto in un array in questo modo:

$data = array(); 
for($c;$c<$scp;$c++){ 
    $data[] = $t[$c]; 
} 
$resultArray[$index] = $data; 

O se vuoi veramente una stringa:

$resultArray[$index] = implode(", ", $data); 

Spero che questo aiuti.

+0

Twisty, solo una piccola correzione: nel tuo codice il valore della posizione è saltato, come puoi vedere nella mia domanda argomento c'è un valore intero prima del nome di ogni squadra, come ottenere questo valore?Ho provato a cambiare il valore lsc in uno senza successo .. – Bender

+1

'$ lsc' è definito come l'ultimo semi-colon ed è impostato come 0 per iniziare. Iniziamo con '$ c' per cercare il nostro primo intero da usare come indice, il valore è assegnato a' $ index'. Il passaggio successivo, '$ lsc' ora è 14, abbiamo bisogno del prossimo elemento per Index. Aumentiamo '$ c' a 15, otteniamo l'elemento per l'indice e incrementiamo' $ c' nuovamente a 16 e iniziamo a raccogliere dati. Quindi, nel nostro secondo passaggio, '$ c' è 14, quindi 15 (indice), e quindi inizia a raccogliere dati da 16 fino a' $ scp', la posizione corrente del punto e virgola. Quindi '$ index' conterrà quel numero intero che stai cercando in ogni passaggio. – Twisty

Problemi correlati