PHP массив для жестких многоуровневых элементов

#php #arrays

#php #массивы

Вопрос:

у меня есть эта структура массива, и я хочу создать другую структуру массива с этим:

 array (size=7)
  0 => 
    array (size=9)
      0 => string 'Dorado' (length=6)
      1 => string '64GB' (length=4)
      2 => string 'Plastico' (length=8)
  1 => 
    array (size=9)
      0 => string 'Blanco' (length=6)
      1 => string '32GB' (length=4)
      2 => string 'Plastico' (length=8)
  2 => 
    array (size=9)
      0 => string 'Blanco' (length=6)
      1 => string '64GB' (length=4)
      2 => string 'Madera' (length=6)
  3 => 
    array (size=9)
      0 => string 'Verde' (length=5)
      1 => string '64GB' (length=4)
      2 => string 'Madera' (length=6)
  4 => 
    array (size=9)
      0 => string 'Azul' (length=4)
      1 => string '128GB' (length=5)
      2 => string 'Cristal' (length=7)
  5 => 
    array (size=9)
      0 => string 'Azul' (length=4)
      1 => string '128GB' (length=5)
      2 => string 'Plastico' (length=8)
  6 => 
    array (size=9)
      0 => string 'Azul' (length=4)
      1 => string '64GB' (length=4)
      2 => string 'Cristal' (length=7)
  

Каждый элемент массива имеет группу характеристик, таких как:

 0 => string 'Dorado' (length=6)
1 => string '64GB' (length=4)
2 => string 'Plastico' (length=8)
....
0 => string 'Azul' (length=4)
1 => string '128GB' (length=5)
2 => string 'Cristal' (length=7)
  

Мне нужен массив, который имеет такие значения, как

Azul=> 64 ГБ => Plastico 128 ГБ => Cristal

если подпункт повторяется, записывайте только дочернее значение

Azul => 64GB => Cristal добавляет Cristal только потому, что 64GB существует

У меня есть этот код на php:

 foreach ($arrCaracteristicas as $itemMadre => $valueMadre) {
    $NombreNodo = $valueMadre[0];
    if ($NumeroCaracteristicas > 1) {
        for ($i = 1; $i <= $NumeroCaracteristicas - 1; $i  ) {
            $NombreCaract = $valueMadre[$i];
            echo "$NombreNodo: $NombreCaract <br>";
            
            array_push( $arrSelectMain[$NombreNodo], $NombreCaract);
            
            if (!isset($arrSelectMain[$NombreNodo][$NombreCaract])) {
                //$arrSelectMain[$NombreNodo]["d"] = $NombreCaract;
            }
            
        }
    }
}
  

Где $arrCaracteristicas имеют длинный массив, а $arrSelectMain имеют ключи первого уровня массива:

Код первого уровня:

 foreach ($arrCaracteristicas as $item => $value) {
    $arrSelectMain[$value[0]] = $value[0];
}
asort($arrSelectMain);
$arrSelectMain = array_unique($arrSelectMain);
  

Это изображение со структурой, которую я хочу:
https://ibb.co/Q8k198Y

Если кто-нибудь может мне помочь, я приглашу пиво через PayPal 🙂

Комментарии:

1. можете ли вы опубликовать точный образец входных данных и точный результат, который вы хотите получить за это?

Ответ №1:

Это должно сработать, сначала разделите массив на столбцы, а затем выполните цикл по элементам.

 $first = array_column($items, 0);
$second = array_column($items, 1);
$third = array_column($items, 2);

$output = [];

for ($i = 0; $i < count($first); $i  ) {
        $output[$first[$i]][$second[$i]][] = $third[$i];
}
  

Взгляните на образец

Комментарии:

1. Вау, это работает: D, у меня есть два вопроса, во-первых: как я могу получить случайное количество предметов, например, в некоторых случаях больше или меньше уровней, я могу получить количество предметов, как я могу это сделать? пришлите мне свой paypal, чтобы пригласить вас на пиво!

2. Спасибо за предложение, но для меня достаточно проголосовать и принять ответ. 🙂 Извините, я не совсем понимаю ваши последующие вопросы. Я просто приведу их здесь, может быть полезно, для получения случайного числа от 1 до 5, которое вы можете использовать mt_rand(1,5) . Для получения подсчета используется функция count() ;

3. Да, конечно, но я не случайное число значения, это случайное число элементов, например: $first = array_column($items, 0); $ second = array_column($items, 1); и так далее, это ряд переменных

4. Может быть, это? count($output['Azul']['128GB']); он вернул бы 2

5. Ну, пока первые три в каждом из ваших массивов создаются одинаковым образом, 4-й, 5-й и остальные элементы просто игнорируются в предоставленном решении. Если вы хотите охватить 4-й уровень, просто переместитесь $third[$i] в ключ массива и используйте $fourth[$i] в качестве значения.