В PHP возможно ли разделить или разделить массив на основе его совпадающих значений? Эти значения массива помещаются в массив динамически. Они являются результатом одного запроса к базе данных mysql. Короче говоря, мне удалось выполнить эту задачу, поместив свой запрос в цикл for и выполнив несколько нелепых кодировок PHP, но этот подход казался очень неэффективным и его было легко сломать. Массив ниже является примером массива, который я пытаюсь разделить:
$returnedData = [
["1003", "correct"],
["1003", "incorrect"],
["1003", "correct"],
["1004", "correct"],
["1004", "incorrect"],
["1004", "incorrect"],
["1005", "incorrect"],
["1005", "correct"],
["1005", "incorrect"]
];
Можно ли разделить этот массив с помощью PHP?
$returnedData = [
[
["1003", "correct"],
["1003", "incorrect"],
["1003", "correct"]
],
[
["1004", "correct"],
["1004", "incorrect"],
["1004", "incorrect"]
],
[
["1005", "incorrect"],
["1005", "correct"],
["1005", "incorrect"]
]
];
Вы можете сгруппировать массив, пройдя его. Попробуйте следующий код:
<?php
$returnedData = [
["1003", "correct"],
["1003", "incorrect"],
["1003", "correct"],
["1004", "correct"],
["1004", "incorrect"],
["1004", "incorrect"],
["1005", "incorrect"],
["1005", "correct"],
["1005", "incorrect"]
];
$grouped_array = array();
foreach($returnedData as $data)
{
if(isset($grouped_array[$data[0]]))
array_push($grouped_array[$data[0]],$data);
else
$grouped_array[$data[0]] = array($data);
}
$grouped_array = array_values($grouped_array);
print_r($grouped_array);
Это делает то, что вам нужно, используя array_reduce
,
$data = [
["1003", "correct"],
["1003", "incorrect"],
["1003", "correct"],
["1004", "correct"],
["1004", "incorrect"],
["1004", "incorrect"],
["1005", "incorrect"],
["1005", "correct"],
["1005", "incorrect"]
];
$data = array_reduce($data, function ($data, $value) {
if (! array_key_exists($value[0], $data)) {
$data[$value[0]] = [];
}
$data[$value[0]][] = $value;
return $data;
}, []);
Используйте этот код
$returnedData2=$log=array();
foreach($returnedData as $i=>$subAry){
$ind=$subAry[0];
if(isset($log[$ind])){
$ind2= $log[$ind];
array_push($returnedData2[$ind2], $subAry);
}else{
$log[$ind]=$i;
$returnedData2[$i]=array();
array_push($returnedData2[$i], $subAry);
}
}
echo '<pre>';
print_r($returnedData2);
попробуй этот код
<?php
$returnedData = [
["1003", "correct"],
["1003", "incorrect"],
["1003", "correct"],
["1004", "correct"],
["1004", "incorrect"],
["1004", "incorrect"],
["1005", "incorrect"],
["1005", "correct"],
["1005", "incorrect"]
];
$output = array();
foreach($returnedData as $value)
{
if(isset($output[$value[0]]))
array_push($output[$value[0]],$value);
else
$output[$value[0]] = array($value);
}
$output = array_values($output);
foreach($output as $data){
print_r(json_encode($data));echo "\n";
}
смотрите вывод здесь:выход
Вы можете проверить это, который сначала форматирует ваш код, а затем возвращает массив ключей соответствия. я использовал json_encode для формата массива результата как ваше требование
<?php
$data = [
["1003", "correct"],
["1003", "incorrect"],
["1003", "correct"],
["1004", "correct"],
["1004", "incorrect"],
["1004", "incorrect"],
["1005", "incorrect"],
["1005", "correct"],
["1005", "incorrect"]
];
$format_data = array();
foreach ($data as $value) {
if (isset($format_data[$value[0]])) {
array_push($format_data[$value[0]], $value);
} else {
$format_data[$value[0]] = array($value);
}
}
$format_array = array_values($format_data);
foreach ($format_array as $data) {
$result[] = json_encode($data);
}
echo "<pre>";
print_r($result);
?>
и конечный результат: