Как я могу сжать значения в массиве? - PullRequest
1 голос
/ 11 июня 2019

У меня есть массив элементов, мне нужно изменить элементы в начале массива, и я использую foreach.

Array
(
    [0] => Array
        (
            [0] => user
            [1] => address
            [2] => detail
            [3] => name
            [4] => family
        )

    [1] => Array
        (
            [0] => user
            [1] => address
        )

    [2] => Array
        (
            [0] => user
            [1] => address
            [2] => detail
            [3] => name
        )

)

Я хочу этот вывод:

Array
(
    [0] => Array
        (
            [0] => user.address.detail.name
            [1] => family
        )

    [1] => Array
        (
            [0] => user
            [1] => address
        )

    [2] => Array
        (
            [0] => user.address.detail
            [1] => name
        )

)

это мой код, но, похоже, он не работает.

    $firstTemp = "";
    foreach ($temps as $row => $temp) {
        if (count($temp) > 2) {
            foreach ($temp as $k => $content) {

                $firstTemp .= $content . '.';
                $endTemp = end($temp);
            }
        }
    }

Есть ли лучший и более краткий способ сделать это?

Ответы [ 4 ]

5 голосов
/ 11 июня 2019

Вы можете pull the last element и implode() остаток элемента из массива, например:

$formatted = [];

foreach($temps as $arr) {

    if(count($arr) == 0){
       return;
    }

     $last = array_pop($arr);

    if(count($arr) > 0) //check if array not empty.
       $formatted[] = [implode(".", $arr), $last];
    else
       $formatted[] = [$last];   
}

4 голосов
/ 11 июня 2019

Я сделал некоторые изменения в вашем фрагменте, чтобы он работал,

$result    = [];
foreach ($temps as $row => $temp) {
    if (count($temp) > 2) {
        // I am taking a slice of the array except for last element and imploding it with `.`
        // then I am fetching the last element of an array
        //  creating an array and pushing it into the result variable
        $result[] = [implode(".", array_slice($temp, 0, count($temp) - 1)), end($temp)];
    }else{
        $result[] = $temp;
    }
}

Я уничтожаю все элементы, кроме последнего, используя array_slice .
end Я использовалполучить последний элемент массива.

Демо .

РЕДАКТИРОВАТЬ 1
Еще один способ добиться того же,

$result    = [];
foreach ($temps as $row => $temp) {
    if (count($temp) > 2) {
        // except last elements
        $result[] = [implode(".", array_slice($temp, 0, -1)), end($temp)];
    }else{
        $result[] = $temp;
    }
}

Демо .

РЕДАКТИРОВАТЬ 2

$result    = [];
foreach ($temps as $row => $temp) {
    $result[] = (count($temp) > 2 ? [implode(".", array_slice($temp, 0, -1)), end($temp)] : $temp);
}

Демо .

РЕДАКТИРОВАТЬ 3

$result = array_map(function($temp){
    return (count($temp) > 2 ? [implode(".", array_slice($temp, 0, -1)), end($temp)] : $temp);
},$temps);

Демо .

РЕДАКТИРОВАТЬ 4 : Без условия

$result = array_map(function($temp){
    return [implode(".",array_slice($temp,0,-1)),array_pop($temp)];
},$temps);

РЕДАКТИРОВАТЬ 5

$result = array_map(function($temp){
    return [implode(".",array_slice($temp,0,-1)),end($temp)];
},$temps);

Демо .

Вывод :

Array
(
    [0] => Array
        (
            [0] => user.address.detail.name
            [1] => family
        )

    [1] => Array
        (
            [0] => user
            [1] => address
        )

    [2] => Array
        (
            [0] => user.address.detail
            [1] => name
        )

)
0 голосов
/ 11 июня 2019

Вы можете сделать это без использования двух foreach структур.Например:

$result = array_map(function (&$temp) {
  $last = array_pop($temp);
  $first = implode('.', $temp);

  return [$first, $last];
}, $temps);
0 голосов
/ 11 июня 2019
$data = [
    [
        'user',
        'address',
        'detail',
        'name',
        'family',
    ], [
        'user',
        'address',
    ], [
        'user',
        'address',
        'detail',
        'name',
        'family',
    ]
];

$result = array_map(function($item) {
    $last = array_pop($item);

    return [implode('.', $item), $last];
}, $data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...