J'ai besoin de quelques superstars de php pour convertir ce tableau: D Voici ma sortie actuelle.

Array(
[0] => Array(
    [name] => S, M, L
    [id] => 168, 169, 170
)

[1] => Array(
    [name] => M, L
    [id] => 169, 170
)

[2] => Array(
    [name] => S
    [id] => 168
)

[3] => Array(
    [name] => S, M
    [id] => 168, 169
)

)

La sortie souhaitée du code ci-dessus.

Array(
[0] => Array(
    [name] => S,
    [id] => 168
)

[1] => Array(
    [name] => M,
    [id] => 169
)

[2] => Array(
    [name] => L
    [id] => 170
)

)

Merci d'avance!

0
neek 29 oct. 2020 à 05:07

2 réponses

Meilleure réponse

Travaillez avec PHP 7.3.

source of test7.php

<?php
$items = [
    [
        'name' => 'S , M,   L',
        'id' => '168,169,170',
    ],
    [
        'name' => 'M,L,XL',
        'id' => '170,171,182',
    ],
];
$res = [];
foreach ($items as $itemOne) {
    // check
    if (!isset($itemOne['name']) && !isset($itemOne['id'])) {
        continue;
    }
    $names = explode(',', $itemOne['name']);
    $names = array_map('trim', $names);
    $ids = explode(',', $itemOne['id']);
    $ids = array_map('trim', $ids);
    foreach ($names as $index => $name) {
        // check
        if (!isset($ids[$index])) {
            continue;
        }
        // non uniq id
        // $res[] = [
        // uniq id, duplicate values will be overwritten
        $res[$ids[$index]] = [
            'name' => $name,
            'id' => $ids[$index],
        ];
    }
}
var_dump($res);

Production:

% php test7.php
array(5) {
  [168]=>
  array(2) {
    ["name"]=>
    string(1) "S"
    ["id"]=>
    string(3) "168"
  }
  [169]=>
  array(2) {
    ["name"]=>
    string(1) "M"
    ["id"]=>
    string(3) "169"
  }
  [170]=>
  array(2) {
    ["name"]=>
    string(1) "M"
    ["id"]=>
    string(3) "170"
  }
  [171]=>
  array(2) {
    ["name"]=>
    string(1) "L"
    ["id"]=>
    string(3) "171"
  }
  [182]=>
  array(2) {
    ["name"]=>
    string(2) "XL"
    ["id"]=>
    string(3) "182"
  }
}
1
Xingchao 29 oct. 2020 à 02:36

Prenez juste toutes les valeurs éclatées dans un tableau puis array_unique s'occupera des doublons.

$data = [
    [
        'name'=>'S, M, L',
        'id' => '168, 169, 170'
    ],

    [
        'name'=>'M, L',
        'id' => '169, 170'
    ],
    [
        'name'=>'S',
        'id' => '168'
    ],
    [
        'name'=>'S, M',
        'id' => '168, 169'
    ],
];

$result = [];

foreach ($data as $each ) {
    $names = explode( ',', str_replace(' ','',$each['name']));
    $ids = explode( ',', str_replace(' ', '', $each['id']) );
    
    array_walk( $names , function ( $name, $key ) use ( $ids, &$result )
    {
        $result[]  = [
            'name' => $name,
            'id' => $ids[ $key ]
        ];
    });
   
    
}

$result = array_unique( $result, SORT_REGULAR );
var_dump( $result);
0
Al-Amin 30 oct. 2020 à 10:18