2016-06-23 4 views
0

Hinweis in diese Frage:einem Array zusammenfassen - fast uniques Wert

https://stackoverflow.com/questions/37934938/marge-array-almost-uniques-value

Ich brauche in einem Array Werte zu verschmelzen. Ich habe Startwerte wie diese:

Array (
    [row] => Array 
     (
     [0] => Array 
      (
      [personalnr] => 824 
      [brutto] => 1000 
      [netto] => 0 
      [notiz] => 0 
      ) 
     [1] => Array 
      (
      [personalnr] => 824 
      [brutto] => 1000 
      [netto] => 0 
      [notiz] => 1 
      ) 
     [2] => Array 
      (
      [personalnr] => 824 
      [brutto] => 1000 
      [netto] => 0 
      [notiz] => 3 
      ) 
     ) 
) 

Problem ist es row[0], row[1], row[2] hat gleiche [personalnr], [brutto], [netto]. [notiz] ist jede Zeile anders. Nehmen wir an, dass ich in meinem Array 400 [rows] habe. Eine Reihe wird viermal dupliziert, aber jedes Mal nur mit unterschiedlichen [notiz]. Ich brauche nur 100 [rows] haben, aber in jeder - Notwendigkeit, Spalte [notiz] 4-mal ([notiz_1][notiz_2][notiz_3][notiz_4] Endbetrag von [rows] ist 100.

Array (
    [row] => Array 
    (
     [personalnr] => 824 
     [brutto] => 100 
     [netto] => 0 
     [notiz] => array 
      (
      [1] = > 1 
      [2] = > 2 
      [3] = > 3 

      ) 
    ) 
) 

Wie jemand sagte, ich versuchte.

foreach ($value as $rownr => $dane) { 
     $nrwiersza = $rownr; 
     $test[$nrwiersza]['personalnr'] = $dane['personalnr']; 
     $test[$nrwiersza]['std'] = $dane['std']; 
     $test[$nrwiersza]["notiz"][] = $dane['notiz']; 


    } 

Aber Array $test hat noch 400 Zeilen.Wie man es mit den Tasten [personalnr], [brutto], [netto] marge und setzen Sie alle [notiz] in [notiz_1], [notiz_2], [notiz_3], [notiz_4].

+1

Meinst du 'merge'? – Ray

+2

Stellen Sie die Frage nicht zweimal. Wenn Sie in der ersten Frage keine Hilfe bekommen, müssen Sie dies klären und nicht erneut posten. – Barmar

Antwort

0

Es sieht fast so aus. Das Problem ist folgendes: Wenn Sie

tun
foreach ($value as $rownr => $dane) { 

$rownr die Zifferntaste von Ihrem ursprünglichen Array ist. Dann tun Sie

$nrwiersza = $rownr; 

so $nrwiersza nun den Wert dieser Schlüssel hat. Dann verwenden Sie $nrwiersza als Schlüssel in Ihrem Ergebnisarray. Dies bedeutet, dass es immer die gleiche Anzahl von Zeilen wie das ursprüngliche Array haben muss, da $nrwiersza eindeutig ist. Sie müssen stattdessen einen nicht eindeutigen Wert aus der Zeile als Schlüssel verwenden. Also statt

$nrwiersza = $rownr; 

Sie können dies stattdessen für den Schlüssel verwenden.

$nrwiersza = $dane['personalnr']; 

Das sollte es lösen.


foreach ($value as $rownr => $dane) { 

    // Change the key here 
    $nrwiersza = $dane['personalnr']; 

    $test[$nrwiersza]['personalnr'] = $dane['personalnr']; 
    // add the other keys from your original array 
    $test[$nrwiersza]['brutto'] = $dane['brutto']; 
    $test[$nrwiersza]['netto'] = $dane['netto']; 
    $test[$nrwiersza]["notiz"][] = $dane['notiz']; 
} 
0

einfach die personalnr als Schlüssel verwenden und entweder erstellen oder Einträge anhängen, je nachdem, ob die Zahl bereits vorhanden .:

$array //your array 
$finalArray = array();  
foreach ($array["row"] AS $data){ 
    if (isset($finalArray[$data["personalnr"]])){ 
     //append notiz 
     //append to array 
     $finalArray[$data["peronalnr"]]["notiz"][] = $data["notiz"]; 
    }else{ 
     //transform notiz to an array 
     $data["notiz"] = array($data["notiz"]); 

     //Create that entry with $data["notiz"] now beeing an array. 
     $finalArray[$data["personalnr"]] = $data; 
    } 
} 

untestet, aber so etwas wie dieses.

Sollte ergeben:

Array (
     [824] => Array 
      (
      [personalnr] => 824 
      [brutto] => 1000 
      [netto] => 0 
      [notiz] => Array (
       [0] => 0, 
       [1] => 1 , 
       [2] => 3 
      ) 
      ) 
     ) 
1

Dieses viel foreach Schleifen ist aber das kann man auch bekommen, was Sie suchen und Schlüssel sind nicht fest einprogrammiert:

// This is the final array, so set here. 
$new = array(); 
// This is how many are in a group 
$reset = 3; 
// This is the starting number for the counter 
$i  = 1; 
// The starting number for the group(s) 
$a  = 1; 
// Loop main row 
foreach($array['row'] as $row) { 
    // Loop through each key 
    foreach($row as $key => $value) { 
     // If the array is not set, assign value 
     if(!isset($new[$a][$key])) 
      $new[$a][$key] = $value; 
     else { 
      // If the array is set already but is a string 
      if(!is_array($new[$a][$key])) { 
       // If the current value doesn't equal stored value, 
       // make an array with stored value and new value 
       if($new[$a][$key] != $value) { 
        $new[$a][$key] = array($new[$a][$key],$value); 
       } 
      } 
      // If array, make new value 
      else 
       $new[$a][$key][] = $value; 
     } 
    } 
    // Reset the increment value 
    // Also advance group number 
    if($i == $reset) { 
     $i = 0; 
     $a++; 
    } 

    $i++; 
} 
// Show new 
print_r($new); 

Sie sollten geben :

Array 
    (
     [0] =>Array 
      (
       [personalnr] => 824 
       [brutto] => 1000 
       [netto] => 0 
       [notiz] => Array 
        (
         [0] => 0 
         [1] => 1 
         [2] => 3 
        ) 
      ) 
     [1] =>Array 
      (
       [personalnr] => 822 
       [brutto] => 2000 
       [netto] => 0 
       [notiz] => Array 
        (
         [0] => 1 
         [1] => 3 
         [2] => 4 
        ) 
      ) 
    ) 
+0

Das Skript funktioniert nicht perfekt. Ich befestige Screenshot. [link] (https://s32.postimg.org/7r9x7mmcl/2016_06_26_23_55_12.jpg) – Jakub

+0

@Jakub Ich bekomme nicht, was der bestimmende Faktor für Array-Schlüssel und Werte ist. Basierend auf Ihrem Beispiel, was ich habe, ist was Sie suchen. – Rasclatt

+0

@Rascaltt - danke für die Antwort. Der bestimmende Faktor für Array-Schlüssel sind immer wenige Felder. Ich habe 100 Zeilen. In jeder Zeile ist "notiz" anders, aber die restlichen Felder sind alle vier Zeilen unterschiedlich. Das richtige Array sollte also nur 25 Zeilen haben. – Jakub

0

Auch “ Ich muss mich hier wundern ... ” kann ’ t der Server die Schwerlast für Sie hier tun?   Was Sie beschreiben, könnte sehr leicht durch eine entsprechende SQL-Abfrage auf der Serverseite behandelt werden.   Kann es daher möglich sein, das System so zu entwerfen, dass der Client eine entsprechende Anfrage an den Server sendet und als Antwort eine Antwort erhält, die keine weitere “ JavaScript-Mangelung erfordert? ”

Verwandte Themen