многомерный массив php group by word - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть массив такого типа, написанный на PHP.

$array[] = ["name"=>"KIT", "v1"=>"val1", "v2"=>"val2", "v3"=>"val3"]; 
$array[] = ["name"=>"BAT", "v1"=>"val1", "v2"=>"val2", "v3"=>"val3"]; 
$array[] = ["name"=>"ISL", "v1"=>"val1", "v2"=>"val1", "v3"=>"val1"]; 
$array[] = ["name"=>"KIT", "v1"=>"val4", "v2"=>"val2", "v3"=>"val2"]; 
$array[] = ["name"=>"BAT", "v1"=>"val1", "v2"=>"val2", "v3"=>"val1"]; 
$array[] = ["name"=>"ENS", "v1"=>"val1", "v2"=>"val2", "v3"=>"val3"]; 
$array[] = ["name"=>"ENS", "v1"=>"val3", "v2"=>"val2", "v3"=>"val1"]; 

Я хотел сгруппировать их так, чтобы вывод был

BAT val1 val2 val3
    val1 val2 val1
ENS val1 val2 val3
    val3 val2 val1
ISL val1 val1 val1
KIT val1 val2 val3
    val4 val2 val2

Я пытался ksort(), но не работал:

$group_arr = [];
    foreach ($array as $key => $value) {
        $group_arr[$value["name"]][$key] = $value;
    }

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вам нужно сделать вложенный цикл.
Чтобы не добавлять имя в новый массив, я извлекаю его и использую array_slice, чтобы не получить его во вложенном foreach.

foreach ($array as $value) {
    $name = $value["name"];
    foreach(array_slice($value,1) as $val){
        $group_arr[$name][] = $val;
    }
}
var_dump($group_arr);

Вывод:

array(4) {
  ["KIT"]=>
  array(6) {
    [0]=>
    string(4) "val1"
    [1]=>
    string(4) "val2"
    [2]=>
    string(4) "val3"
    [3]=>
    string(4) "val4"
    [4]=>
    string(4) "val2"
    [5]=>
    string(4) "val2"
  }
  ["BAT"]=>
  array(6) {
    [0]=>
    string(4) "val1"
    [1]=>
    string(4) "val2"
    [2]=>
    string(4) "val3"
    [3]=>
    string(4) "val1"
    [4]=>
    string(4) "val2"
    [5]=>
    string(4) "val1"
  }
  ["ISL"]=>
  array(3) {
    [0]=>
    string(4) "val1"
    [1]=>
    string(4) "val1"
    [2]=>
    string(4) "val1"
  }
  ["ENS"]=>
  array(6) {
    [0]=>
    string(4) "val1"
    [1]=>
    string(4) "val2"
    [2]=>
    string(4) "val3"
    [3]=>
    string(4) "val3"
    [4]=>
    string(4) "val2"
    [5]=>
    string(4) "val1"
  }
}

https://3v4l.org/ebuFt

0 голосов
/ 10 февраля 2019

Вы должны попробовать:

foreach ($array as $value) {
    $v = $value;
    unset($v['name']);
    $group_arr[$value["name"]][] = $v;
}

Нет необходимости использовать ksort.Обратите внимание, что ключи $array являются просто целыми числами, и они вам не нужны в массиве результатов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...