Преобразование строки в массив [PHP]

1

Простой вопрос: как я могу преобразовать эту строку:

"'One' => 1,'Two' => 2,'Three' => 3,'Four' => 4,"

Для такого массива:

array['One'] = 1;
array['Two'] = 2;
array['Three'] = 3;
array['Four'] = 4;
  • 0
    Вы пробовали что-нибудь? как взорваться и обрезать ??
  • 0
    Я попытался взорваться, но это положить массив, как этот массив [0] = 'One => 1' массив [1] = 'Two => 2'
Показать ещё 2 комментария
Теги:
arrays

4 ответа

3
Лучший ответ

Использовать регулярное выражение и array_combine

preg_match_all('/\'(\w+)\'\s*=>\s*(\d+)/', $str, $m);
print_r(array_combine($m[1], $m[2]));

демонстрация

2
$string = "'One' => 1,'Two' => 2,'Three' => 3,'Four' => 4,";
$array = explode(',',$string);
foreach($array as $item){
    $new_items = explode(' => ', $item);
    $key = $new_items[0];
    $value = $new_items[1];
    $new_array[][$key] = $value;
}
var_dump($new_array);
  • 0
    На самом деле из-за последней запятой в конце у вас будет пустой элемент, поэтому вам понадобится $array = array_filter($array); между первым explode() и foreach()
1

Здесь проверенное решение:

    $input = "'One' => 1,'Two' => 2,'Three' => 3,'Four' => 4,";
    $gen = new ArrayGenerator($input);
    $this->assertSame([
        'One' => 1,
        'Two' => 2,
        'Three' => 3,
        'Four' => 4,
    ], $gen->translate());

и здесь полный код

use PHPUnit\Framework\TestCase;

class FooTest extends TestCase
{
    public function testItems()
    {
        $input = "'One' => 1,'Two' => 2,'Three' => 3,'Four' => 4,";
        $parser = new Parser($input);
        $this->assertEquals([
            "'One' => 1",
            "'Two' => 2",
            "'Three' => 3",
            "'Four' => 4"
        ], $parser->items());
    }

    public function testKeyValue()
    {
        $input = "'One' => 1";
        $parser = new KeyValue($input);
        $this->assertEquals([
            "'One'",
            "1",
        ], $parser->items());
    }

    public function testKeyValueWithoutQuotas()
    {
        $input = "'One' => 1";
        $parser = new KeyValue($input);
        $this->assertEquals([
            "One",
            "1",
        ], $parser->itemsWithoutQuotas());
    }

    public function test()
    {
        $input = "'One' => 1,'Two' => 2,'Three' => 3,'Four' => 4,";
        $gen = new ArrayGenerator($input);
        $this->assertSame([
            'One' => 1,
            'Two' => 2,
            'Three' => 3,
            'Four' => 4,
        ], $gen->translate());
    }
}

class ArrayGenerator
{
    private $input;

    public function __construct(string $input)
    {
        $this->input = $input;
    }

    public function translate()
    {
        $parser = new Parser($this->input);
        $parsed = $parser->items();

        $trans = [];

        foreach ($parsed as $item) {
            $pair = new KeyValue($item);
            $trans[$pair->itemsWithoutQuotas()[0]] = (int) $pair->itemsWithoutQuotas()[1];
        }

        return $trans;
    }
}

class KeyValue
{
    private $input;

    public function __construct(string $input)
    {
        $this->input = $input;
    }

    public function items()
    {
        $exploded = explode(' => ', $this->input);
        return $exploded;
    }

    public function itemsWithoutQuotas()
    {
        $items = $this->items();
        foreach ($items as $key => $item) {
            $items[$key] = str_replace("'", "", $item);
        }
        return $items;
    }
}

class Parser
{
    private $input;

    public function __construct(string $input)
    {
        $this->input = $input;
    }

    public function items()
    {
        $exploded = explode(',', $this->input);
        $exploded = array_filter($exploded, function ($item) {
            return $item != "";
        });
        return $exploded;
    }
}
1

Вы можете просто использовать функцию php array_flip:

array_flip - Обменивает все ключи со связанными значениями в массиве

Предупреждение о столкновении:

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

Пример # 2 Пример array_flip(): столкновение

<?php
$input = array("a" => 1, "b" => 1, "c" => 2);
$flipped = array_flip($input);

print_r($flipped);
?>

Вышеприведенный пример выводит:

Array
(
    [1] => b
    [2] => c
)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню