如何使用PHP将数组转换为具有特殊键的多维数组?

3
我有一个数组。
$array = [
    0=>1 
    1=>Jon 
    2=>jon@email.com 
    3=>2 
    4=>Doe 
    5=>doe@email.com 
    6=>3
    7=>Foo 
    8=>foo@email.com
]

我想要做的是给每个值添加一个额外的数值,这样在循环数组时就可以访问它。例如:
$array=[
    0=>1[id] 
    1=>Jon[name] 
    2=>jon@email.com[email] 
    3=>2[id] 
    4=>Doe[name] 
    5=>doe@email.com[email] 
    6=>3[id] 
    7=>Foo[name] 
    8=>foo@email.com[email]
]

我猜应该是一个多维数组? 如何正确地做到这一点呢?


正确的做法应该是这样的:$array = [ [ 'id'=>1, 'name'=>'Jon', 'email'=>'jon@email.com' ], [ 'id'=>2, 'name'=>'Doe', 'email'=>'doe@email.com' ], [ 'id'=>3, 'name'=>'Foo', 'email'=>'foo@email.com' ] ]; - IcedAnt
6个回答

3
循环遍历数组并检查每个项目的键,根据它创建新数组并插入值。
$newArr = [];    
foreach($array as $key=>$value){
    if ($key % 3 == 0)
        $newArr[] = ["id" => $value];
    if ($key % 3 == 1)
        $newArr[sizeof($newArr)-1]["name"] = $value;
    if ($key % 3 == 2)
        $newArr[sizeof($newArr)-1]["email"] = $value;
}

请在示例中检查结果。


2
这是唯一一个真正回答了 OP 的问题的答案。 - IcedAnt
一个问题。我如何访问“string”或“int”? - Davis
@Davis 如果你的意思是从数组中获取整数或字符串值,那么你应该使用 $array[index] 来获取值。例如 $array[1],而值的类型并不重要。 - Mohammad

0

是的,只需使用二维数组

$arr = array();

$arr[0][0] = "1"
$arr[0][1] = "Jon"
$arr[0][2] = "jon@email.com"

$arr[1][0] = "2"
$arr[1][1] = "Doe"
$arr[1][2] = "doe@email.com"

0

由于在PHP中,数组是一种映射类型,因此我建议将其用作映射或创建一个包含数据的类。

$arr = array();
$arr[0]['ID'] = 1;
$arr[0]['name'] = "John";
$arr[0]['mail'] = "john@email.com;

一个类的示例:

 <?PHP
 class User
    {
        public $id;
        public $name;
        public $mail;

        function __construct($ID,$name,$mail)
        {
            $this->id = $ID;
            $this->name = $name;
            $this->mail = $mail;
        }
    }
?>

然后,你可以像这样简单地使用它:

 <?PHP
    require_once("User.php");
    $user = new User(1,"Mario","maio290@foo.bar");
    echo $user->name;
?>

0

你也可以这样做:

$array1 = ["name"=>"alaex","class"=>4];
$array2 = ["name"=>"aley","class"=>10];
$array3 = ["student"=>$array1,"student2"=>$array2];

print_r($array3);

0
一个简单但经常使用的解决方案是使用带有字符串键的多维数组,以获得更好的可读性:
$array = [
    0 => [
        'id'    => 1,
        'name'  => 'Jon',
        'email' => 'jon@email.com',
    ],
    1 => [
        'id'    => 2,
        'name'  => 'Doe',
        'email' => 'doe@email.com',
    ],
    2 => [
        'id'    => 3,
        'name'  => 'Foo',
        'email' => 'foo@email.com',
    ],
];

你可以像这样循环遍历它:
for ($array as $item) {
    // $item['id']
    // $item['name']
    // $item['email']
}

但由于PHP是一种面向对象的语言,我建议为数据结构创建一个类。这样更容易阅读,而且您可以非常轻松地添加与实体相关的功能等。

class Person {
    public $id;
    public $name;
    public $email;

    function __construct($id, $name, $email) {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
    }
}

$array = [
    0 => new Person(1, 'Jon', 'jon@email.com'),
    1 => new Person(2, 'Doe', 'doe@email.com'),
    2 => new Person(3, 'Foo', 'foo@email.com'),
];

你可以像这样循环遍历它:
for ($array as $person) {
    // $person->id
    // $person->name
    // $person->email
}

0

使用 array_chunk 的结果,再使用 array_map,方法如下:

 $array=array_map(function($val){ return array_combine(['id','name','email'],$val);}, array_chunk($array,3));

请注意,array_chunk 的第二个参数取决于列数和 array_combine 中使用的第一个数组。
在此处查看工作代码

@IcedAnt,现在有一个更多的答案来解决这个问题。 - Elementary
一个问题。我如何访问“string”或“int”? - Davis
@Davis 再次查看 https://3v4l.org/Y3ND2 完整的工作示例...被标记为解决方案的答案很难处理多达十列的数据,需要许多复杂的计算和代码。而我的方法可以。 - Elementary
把数据是字符串、整数还是日期的检查,放在我的代码里需要访问它。这就是在value中添加额外值的背后想法。 - Davis
是的,实际上我没有问正确的问题。 我的问题已经得到了回答。 感谢大家的帮助! - Davis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接