Как разбить строчку сгруппировав ее по ключам?

239
01 февраля 2018, 19:03

Есть строчка вида

3199996|Amazing Dubbing||3199114|AniDUB||3204688|AniLibria||3204934|AniMaunt||3198662|AnimeVost||3199009|AniPlay||3199879|AniRise||3198674|AniStar||3210309|Anything Group||3199048|KBK||3201994|KitsuneBox||3200688|Risens Team||3199154|SHIZA Project||3199180|TAKEOVER Project|||3206565|AniDUB||3214108|AniLibria||3204770|AnimeVost||3214571|AniRise||3204751|AniStar||3213831|Anything Group||3206322|KBK||3211200|KitsuneBox||3205028|Risens Team||3210273|SHIZA Project|||3216986|AniDUB||3218426|AniLibria||3214254|AnimeVost||3219614|AniRise||3214057|AniStar||3214746|Anything Group||3219664|KBK||3214608|Risens Team||3215849|SHIZA Project|||3218870|AnimeVost||3218862|AniStar||3219909|Anything Group||3218760|Risens Team

Все что я могу сделать с этой кашей

    $str = "3199996|Amazing Dubbing||3199114|AniDUB||3204688|AniLibria||3204934|AniMaunt||3198662|AnimeVost||3199009|AniPlay||3199879|AniRise||3198674|AniStar||3210309|Anything Group||3199048|KBK||3201994|KitsuneBox||3200688|Risens Team||3199154|SHIZA Project||3199180|TAKEOVER Project|||3206565|AniDUB||3214108|AniLibria||3204770|AnimeVost||3214571|AniRise||3204751|AniStar||3213831|Anything Group||3206322|KBK||3211200|KitsuneBox||3205028|Risens Team||3210273|SHIZA Project|||3216986|AniDUB||3218426|AniLibria||3214254|AnimeVost||3219614|AniRise||3214057|AniStar||3214746|Anything Group||3219664|KBK||3214608|Risens Team||3215849|SHIZA Project|||3218870|AnimeVost||3218862|AniStar||3219909|Anything Group||3218760|Risens Team";
$mas = explode("|||", $str);
$str_result="";
foreach ($mas as $value) {
    $mas1 = explode("||", $value);
    foreach ($mas1 as $value1) {
        $mas2 = explode("|", $value1);
        $str_result .= $mas2[1]."-".$mas2[0]."<br>";
    }
}
echo $str_result;

Результат выполнения кода

Amazing Dubbing-3199996
AniDUB-3199114
AniLibria-3204688
AniMaunt-3204934
AnimeVost-3198662
AniPlay-3199009
AniRise-3199879
AniStar-3198674
Anything Group-3210309
KBK-3199048
KitsuneBox-3201994
Risens Team-3200688
SHIZA Project-3199154
TAKEOVER Project-3199180
AniDUB-3206565
AniLibria-3214108
AnimeVost-3204770
AniRise-3214571
AniStar-3204751
Anything Group-3213831
KBK-3206322
KitsuneBox-3211200
Risens Team-3205028
SHIZA Project-3210273
AniDUB-3216986
AniLibria-3218426
AnimeVost-3214254
AniRise-3219614
AniStar-3214057
Anything Group-3214746
KBK-3219664
Risens Team-3214608
SHIZA Project-3215849
AnimeVost-3218870
AniStar-3218862
Anything Group-3219909
Risens Team-3218760

Задача: преобразовать строчку из исходного вида в такую

AnimeVost|3198662|3204770|3214254|3218870||AniStar|3198674|3204751|3214057|3218862||Anything Group|3210309|3213831|3214746|3219909||Risens Team|3200688|3205028|3214608|3218760||AniDUB|3199114|3206565|3216986||AniLibria|3204688|3214108|3218426||.....||Amazing Dubbing|3199996

AnimeVost, AniStar и т.д. - это группы людей, 3198662, 3204770 и т.д. - это айди произведений, созданных этими группами людей. Мне необходимо отсортировать строчку так, чтоб присвоить группе все id, которые ей принадлежат. Причем та группа у которой больше id идет первой, далее та у которой меньше чем у первой и т.д. (по убыванию кол-ва id)

Answer 1

поделить можно так, но что потом то делать?

$all = explode('|||', $str);
foreach($all as $i) {
   $temp = explode('||', $i); 
   $arr = [];  
   foreach($temp as $x) {
      list($v, $k) = explode('|', $x); 
      $arr[] = [$k =>$v];
   }
   $arr = array_merge_recursive(...$arr);
   $res[] = $arr;
}
print_r($res);

https://eval.in/946366

Answer 2
 $str="3199996|Amazing Dubbing||3199114|AniDUB||3204688|AniLibria||3204934|AniMaunt||3198662|AnimeVost||3199009|AniPlay||3199879|AniRise||3198674|AniStar||3210309|Anything Group||3199048|KBK||3201994|KitsuneBox||3200688|Risens Team||3199154|SHIZA Project||3199180|TAKEOVER Project|||3206565|AniDUB||3214108|AniLibria||3204770|AnimeVost||3214571|AniRise||3204751|AniStar||3213831|Anything Group||3206322|KBK||3211200|KitsuneBox||3205028|Risens Team||3210273|SHIZA Project|||3216986|AniDUB||3218426|AniLibria||3214254|AnimeVost||3219614|AniRise||3214057|AniStar||3214746|Anything Group||3219664|KBK||3214608|Risens Team||3215849|SHIZA Project|||3218870|AnimeVost||3218862|AniStar||3219909|Anything Group||3218760|Risens Team";
 $str=str_replace('|||','||',$str);
 $mass=explode("||",  $str);
 $str2="";
foreach ($mass as $key => $value) {
 $mass2=explode("|",  $value);
$str2=$str2.",".$mass2[0].",".$mass2[1];
}
$str2=substr($str2, 1);
 $mass3=explode(",",  $str2);
 $c=count($mass3);
 for($i=0;$i<=$c;$i++){
if($i & 1){$arrr[$mass3[$i-1]]=$mass3[$i]; $unic_text[$mass3[$i]]=$mass3[$i-1];}
 }
foreach ($unic_text as $key => $value) {
  foreach ($arrr as $key1 => $val) {
if($key==$val){
$masiv[$key]=$masiv[$key]."|".$key1;
  }}
}
print_r($masiv);

Как-то так, потом usort, а уже потом implode. Хотя думаю есть более элегантное решение.

READ ALSO
Ajax отправка формы не работает

Ajax отправка формы не работает

ajax отправка формы н работает, выдает в консоле ошибку как на скрине

180
Как поместить свойство метода в таблицу

Как поместить свойство метода в таблицу

Мне нужно поместить данный массив в таблицу

240
Не правильно работает,как исправить?

Не правильно работает,как исправить?

Здравствуйте,столкнулся с такой проблемойХочу подсвечивать активные вкладки,но когда добавлю index, ticket то перестаёт работать правильно

261
Убрать все символы, кроме &ldquo; a-z A-Z . &#39; - &rdquo; - PHP

Убрать все символы, кроме “ a-z A-Z . ' - ” - PHP

Подскажите регулярное выражениеНеобходимо удалить все символы, кроме:

190