PHP форматирование массива в новый массив - PullRequest
0 голосов
/ 18 декабря 2018

Привет, ребята. Я новичок в PHP и хочу с точки зрения производительности наилучшим образом преобразовать этот массив:

$old = array(
    20 =>
        array(
            'name' => 'Heels',
            'path' => '1/2/10/15/20',
        ),
    15 =>
        array(
            'name' => 'Sandals',
            'path' => '1/2/80/96/15',
        ),
    10 =>
        array(
            'name' => 'Trainers',
            'path' => '1/2/80/96/10',
        ),
);

В это:

$new = array(
    20 =>
        array(
            'value' => 20,
            'label' => 'Trainers > Sandals > Heels',
        ),
);

Будучи загруженным множеством записей, обязательно взрывающих пути и отображающих их с помощью идентификаторов, это замедлит его с точки зрения производительности, просто задаваясь вопросом, существует ли более эффективный способ, если это возможно, спасибо.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Если я правильно понимаю, вы пытаетесь получить последний путь, соответствующий каждой категории, и вывести его в виде хлебной крошки.

Сначала вы можете отсортировать ключи (идентификаторы), а затем выполнить цикл по созданию массива.хлебная крошка.

arsort($paths); # This gives the desired output in OP but makes more sense to use krsort() to sort DESC not ASC

$breadcrumb = (object) array (
    'value' => array_keys($paths)[count($paths) - 1], # Get the highest id - if using krsort() use array_keys($paths)[0]
    'labels' => implode(' > ', array_column($paths, 'name'));
);

# Update derived from The fourth bird's answer which skips the need for the foreach().
# Concept is to build an array of the labels to then make look pretty with the > effect

Вот демоверсия .

Вывод:

object (stdClass) (2) {
    ["value"] => int(20)
    ["labels"] => string(26) "Trainers > Sandals > Heels"
}
0 голосов
/ 18 декабря 2018

Другим вариантом может быть создание карты ключей и имен.Затем вы можете взять ключ из картографа, чтобы создать путь:

$result = [];
$mapper = array_combine(array_keys($old), array_column($old, 'name'));
foreach ($old as $key => $value) {
    $path = implode(' > ', array_map(function($x) use ($mapper) {
        return $mapper[(int)$x];
    }, explode('/', $value['path'])));

    $result[$key] = ['value' => $key,'label' => $path];
}

print_r($result);

Php demo

0 голосов
/ 18 декабря 2018

Это жестко закодированный способ, но я думаю, что вам нужно дать немного больше информации, чтобы получить динамическое решение.

<?php

$old = array(
    20 =>
        array(
            'name' => 'Heels',
            'path' => '1/2/10/15/20',
        ),
    15 =>
        array(
            'name' => 'Sandals',
            'path' => '1/2/80/96/15',
        ),
    10 =>
        array(
            'name' => 'Trainers',
            'path' => '1/2/80/96/10',
        ),
);


ksort($old);
$breadcrumbs = [];
$currentKey = 0;

foreach ( $old as $itemKey => $item) {
    $currentKey = $itemKey;
    $breadcrumbs[] = $item;

}
$new = [$currentKey] = [
    'value' => $currentKey,
    'label' => implode(' > ', $breadcrumbs)
];

printf($new);
...