2017-04-06 3 views
-1

Guten Morgen Jungs!Ordnen Sie JSON Daten speichern Duplikate in einer Zeile

Ich versuche, eine harte Zeit, herauszufinden, wie die folgende JSON arrangieren:

{ 
    "showElement": "1", 
    "degrees": [{ 
     "Name": "Bachelor in Psychology", 
     "Number": "53", 
     "degree": "Bachelor's Degree" 
    }, { 
     "Name": "Certificate", 
     "Number": "56", 
     "degree": "Certificate" 
    }, { 
     "Name": "High School Diploma", 
     "Number": "28", 
     "degree": "High School" 
    }, { 
     "Name": "Bachelor in Sociology", 
     "Number": "109", 
     "degree": "Bachelor's Degree" 
    }] 
} 

In diese:

{ 
    "showElement": "1", 
    "degrees": [{ 
     "Name": "Bachelor in Psychology", "Bachelor in Sociology", 
     "Number": "53","109", 
     "degree": "Bachelor's Degree" 
    }, { 
     "Name": "Certificate", 
     "Number": "56", 
     "degree": "Certificate" 
    }, { 
     "Name": "High School Diploma", 
     "Number": "28", 
     "degree": "High School" 
    }] 
} 

Grundsätzlich setzen die gleichen Grad an einem Ort und haben alle Namen dieses Grades getrennt durch ein Komma

Ich habe bereits diese JSON in eine Variable decodiert:

$data = json_decode($topDegrees[1]["diplomas"],true); 

Vielen Dank im Voraus für Ihre Hilfe!

+0

Warum würden Sie das – RiggsFolly

+0

tun möchten, dass JSON nicht gültig ist .. – carmine

Antwort

0

ich mit diesem

$json = <<<JSON 
{ 
    "showElement": "1", 
    "degrees": [{ 
     "Name": "Bachelor in Psychology", 
     "Number": "53", 
     "degree": "Bachelor's Degree" 
    }, { 
     "Name": "Certificate", 
     "Number": "56", 
     "degree": "Certificate" 
    }, { 
     "Name": "High School Diploma", 
     "Number": "28", 
     "degree": "High School" 
    }, { 
     "Name": "Bachelor in Sociology", 
     "Number": "109", 
     "degree": "Bachelor's Degree" 
    }] 
} 
JSON; 

$data = json_decode($json, true); 

$degrees = $data['degrees']; 
$names = array_column($degrees, 'degree'); 
$count = array_count_values($names); 
$duplicates = array_filter($count, function($var) { 
    return $var > 1; 
}); 


foreach (array_flip($duplicates) as $degree) { 

    $filter = array_filter($degrees, function($var) use ($degree) { 
    return ($var['degree'] === $degree); 
    }); 

    $names = []; 
    $numers = []; 
    foreach ($filter as $item) { 
    $names[] = $item['Name']; 
    $numbers[] = $item['Number']; 
    } 
    $indices = array_keys($filter); 
    $index = array_shift($indices); 
    $degrees[$index]['Name'] = $names; // = join(', ', $names); 
    $degrees[$index]['Number'] = $numbers; // = join(', ', $numbers); 

    while (count($indices)) { 
    unset($degrees[array_shift($indices)]); 
    } 
} 

$data['degrees'] = $degrees; 

print_r(json_encode($data)); 
// {"showElement":"1","degrees":[{"Name":["Bachelor in Psychology","Bachelor in Sociology"],"Number":["53","109"],"degree":"Bachelor's Degree"},{"Name":"Certificate","Number":"56","degree":"Certificate"},{"Name":"High School Diploma","Number":"28","degree":"High School"}]} 

Ihre gewünschte json Ausgabe nicht gültig kam ist, ich habe eine Arraystruktur an seinem Platz gemacht. Wenn Sie einen kommagetrennten Text benötigen, verwenden Sie einfach die Join-Anweisungen, die ich auskommentiert habe.

+0

Das perfekt @glaux gearbeitet, wir danken Ihnen sehr viel! – Agrus

0
$str = '{ 
    "showElement": "1", 
    "degrees": [{ 
     "Name": "Bachelor in Psychology", 
     "Number": "53", 
     "degree": "Bachelor\'s Degree" 
    }, { 
     "Name": "Certificate", 
     "Number": "56", 
     "degree": "Certificate" 
    }, { 
     "Name": "High School Diploma", 
     "Number": "28", 
     "degree": "High School" 
    }, { 
     "Name": "Bachelor in Sociology", 
     "Number": "109", 
     "degree": "Bachelor\'s Degree" 
    }] 
}'; 
$str_arr = json_decode($str); 
foreach($str_arr->degrees as $k=>$val){ 
    if($val->degree == 'Bachelor\'s Degree'){ 
     $new['Bachelor'][] = $val; 
    }else{ 
     $new[] = $val; 
    } 
} 

foreach($new['Bachelor'] as $aa){ 
    $nameStr[]= $aa->Name; 
    $numStr[] = $aa->Number; 
} 
$nameStr = implode(', ', $nameStr); 
$numStr = implode(', ', $numStr); 
$degree = 'Bachelor\'s Degree'; 
$new[] = (object) array($nameStr, $numStr, $degree); 
unset($new['Bachelor']); 

echo $json = json_encode($new); 
echo "<pre>"; print_r(json_decode($json)); 

Hoffe das hilft.

Demo here

0

Dies sollte es tun:

<?php 
$json = '{ 
"showElement": "1", 
"degrees": [{ 
    "Name": "Bachelor in Psychology", 
    "Number": "53", 
    "degree": "Bachelors Degree" 
}, { 
    "Name": "Certificate", 
    "Number": "56", 
    "degree": "Certificate" 
}, { 
    "Name": "High School Diploma", 
    "Number": "28", 
    "degree": "High School" 
}, { 
    "Name": "Bachelor in Sociology", 
    "Number": "109", 
    "degree": "Bachelors Degree" 
}] 
}'; 

$items = json_decode($json, true); 
$orderedItems = []; 
$final = ['showElement' => 1]; 
foreach ($items['degrees'] as $item) { 
    $orderedItems[$item['degree']]['Name'][] = $item['Name']; 
    $orderedItems[$item['degree']]['Number'][] = $item['Number']; 
    $orderedItems[$item['degree']]['degree'] = $item['degree']; 
} 

foreach ($orderedItems as $order) { 
    $order['Name'] = (count($order['Name']) > 1) ? $order['Name'] : $order['Name'][0]; 
    $order['Number'] = (count($order['Number']) > 1) ? $order['Number'] : $order['Number'][0]; 
    $final['degrees'][] = [ 
     'Name' => $order['Name'], 
     'Number' => $order['Number'], 
     'degree' => $order['degree'] 
    ]; 
} 

echo json_encode($final);