2016-10-13 5 views
1

Ich habe folgendes indiziertes ArrayPHP Export indiziertes Array in CSV

$export_data = array (
    [0] => 1, 
    [1] => 2, 
    [2] => 3, 
    [3] => 4, 
    [4] => 5, 
    [8] => 9, 
    [9] => 10, 
); 

Ich weiß, wie es exportieren fputcsv mit nach CSV. Jedoch mein Problem ist, dass ich die Daten in die richtige Spalte exportieren muss, d. H. Wert in $ export_data [8] muss in Spalte 9 nicht Spalte 6 exportiert werden.

Wie kann das bitte gemacht werden?

+1

einfach: bauen Sie Ihr Array richtig an erster Stelle. Wenn Sie einen Wert in "Spalte 9" möchten, dann setzen Sie es in den Punkt des Arrays, die Spalte 9, die Index 8. REPRÄSENTIERT ist. –

Antwort

2

Hier gehen Sie, Chef.

$export_data = array_replace(array_map(function($v){return null;}, range(0, max(array_keys($export_data)))), $export_data); 

Geprüft 100.000 Iterationen und die Ergebnisse sind in Sekunden:

Version  Run1 Run2 Run3 
PHP 5.6.20 .58 .55 .50 
PHP 7.0.5 .18 .21 .21 

Jetzt für die Erklärung, damit ich der Hexerei bezichtigt nicht mit downvotes gepeitscht bekommen oder erhalten.

$export_data = array (
    0 => 1, 
    1 => 2, 
    2 => 3, 
    3 => 4, 
    4 => 5, 
    8 => 9, 
    9 => 10, 
); 

$export_data = 
    array_replace(// replace the elements of the 10-item array with your original array and the filled-in blanks are going to be null. I did not use array_merge() because it would append $export_data onto our dynamic range() array rather than replacing elements as needed. 
     array_map(// loop the 10-item array and apply the declared function per element. This function ends up returning the 10-item array with all keys intact but the values will be null 
      function($v){return null; /* return ''; // if you prefer and empty string instead of null*/}, // set each value of the 10-item array to null 
      range(// create an 10-item array with indexes and values of 0-9 
       0, 
       max(array_keys($export_data)) // get the highest key of your array which is 9 
      ) 
     ), 
     $export_data // your original array with gaps 
    ); 

var_dump($export_data); 
print_r($export_data); 
+0

Vielen Dank für Ihre Zeit und Ihre Antwort. Alle anderen Antworten waren korrekt, aber das macht genau das, was ich in einer Codezeile brauchte. Auch super Erklärung nochmals danke. – user4676307

+0

@ user4676307 Ich bin froh, dass es Ihnen gefällt. Ich habe ursprünglich einen ähnlichen Ansatz zu [Jimmmy] (http://stackoverflow.com/users/5545687/jimmmy) in Erwägung gezogen, wollte Ihnen aber die Leistungsfähigkeit der verschiedenen PHP-Funktionen zeigen :-). Viel Glück mit Ihrem Projekt! – MonkeyZeus

+1

Hexerei! :-) Ich mag deine Lösung, es wird sicher schneller als meine auf längeren Arrays (die meisten CSV sind). +1 – Jimmmy

2

Wenn ich richtig verstehe, möchten Sie Spalten zwischen den Daten frei, so dass die Schlüssel Spaltennummer übereinstimmen.

$arr = array(
0 => 1, 
1 => 2, 
2 => 3, 
3 => 4, 
4 => 5, 
8 => 9, 
9 => 10, 
); 

$csvArray = array(); 
$maxKey = max(array_keys($arr)); 
for($i = 0; $i <= $maxKey; $i++){ 

if(array_key_exists($i, $arr)){ 
    $csvArray[$i] = $arr[$i]; 
} else { 
    $csvArray[$i] = null; 
} 
} 
print_r($csvArray); 

Demo hier: live demo

zu beschreiben, nur Zyklus durch Anordnung und überprüfen, ob Schlüssel gesetzt ist, wenn ist, dessen Wert auf das nächste Array assing, wenn nicht, weisen null


Optimiert:

$csvArray = array(); 
$maxKey = max(array_keys($arr)); 
// ++$i is microscopically faster when going for the long haul; such as 10,000,000 iterations 
// Try it for yourself: 
// $start = microtime(true); 
// for($i=0; $i<10000000; $i++){} 
// echo (microtime(true) - $start).' seconds'; 
for($i = 0; $i <= $maxKey; ++$i){ 
    // we can use isset() because it returns false if the value is null anyways. It is much faster than array_key_exists() 
    $csvArray[$i] = (isset($arr[$i]) ? $arr[$i] : null); 
} 
+0

Hallo, ich wusste nicht über ++ $ i Vs. $ i ++, aber ich bin in diesem Fall gegen isset(), weil null der gemeinsame Wert des Arrays sein kann (und der Schlüssel existiert). In meinem Beispiel macht es keinen Unterschied, aber in anderen Anwendungen kann es .. – Jimmmy

+0

'++ $ i' ist eines dieser Dinge, die nicht so viel hilft, wie es vor allem mit PHP 5 und 7, aber es ist immer noch um. Einer der Hauptbereiche, in denen es sich mit Ihnen anlegen kann, ist Dinge wie 'echo' zu tun. Diese Iteration # '. ++ $ i; 'vs' echo' Diese Iteration # '. $ I ++; '. Wie für die 'isset()', kann es sicherlich Kopfschmerzen für jeden, der sich nicht bewusst ist, die gotchas. – MonkeyZeus

-1

ich möchte nur das Array vollständig mit leeren Werten füllen für die leeren Spalten:

$export_data = array (
    [0] => 1, 
    [1] => 2, 
    [2] => 3, 
    [3] => 4, 
    [4] => 5, 
    [5] => '', 
    [6] => '', 
    [7] => '', 
    [8] => 9, 
    [9] => 10, 
); 

Ohne die Indizes (weil sie in jedem Fall automatisch sind):

$export_data = array (
    1, 
    2, 
    3, 
    4, 
    5, 
    '', 
    '', 
    '', 
    9, 
    10, 
);