2010-05-14 4 views
1

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

Объяснить

$x[1][11]=11; 
$x[1]=1; 

var_dump($x); 

В приведенном выше коде я получаю только х [1].

Справа бы

$x[1]=1; 
$x[1][11]=11; 

var_dump($x); 

Но в моем случае я могу гарантировать, что точка х [1] придет первым, и х [1] [11] придет после.

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

Я пытаюсь получить массив как дерево

$x[node]=node data 
$x[node][childs]=childs data 
etc.. 

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

Спасибо

+0

Вы полностью изменили историю, сказав, что вы пытаетесь построить дерево. Теперь было бы критически полезно узнать, как выглядят ваши входящие данные. – erisco

ответ

2

Если вы установили $x[1] как 1, то это номер.
Если вы установили $x[1][11] на что-нибудь, то $x[1] - это массив.
Это не может быть число и массив одновременно.

$x = array(
    1 => 1 
); 

$x = array(
    1 => array(
     11 => 11 
    ) 
); 

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


Если вам действительно нужно каждый узел и иметь значение и детей, вам придется идти с чем-то вроде этого:

array(
    1 => array(
     'value' => 1, 
     'children' => array(
      11 => array(
       'value' => 11, 
       'children' => array(...) 
      ) 
     ) 
    ) 
) 
2

Case One:

// make $x[1] equal to array(11 => 11) 
$x[1][11]=11; 

// make $x[1] equal to 1 
$x[1]=1; 

// result, $x[1] is equal to 1 

Вариант 2:

// make $x[1] equal to 1 
$x[1]=1; 

// make $x[1] equal to array(11 => 11) 
$x[1][11]=11; 

// result, $x[1] is equal to array(11 => 11) 

Я не знаю, чего вы действительно хотите $x[1] быть. Я предполагаю, что вы можете захотеть этого:

// make $x[1] equal to array(1) 
$x[1][] = 1; 

// append 11, making $x[1] equal to array(1, 11) 
$x[1][] = 11; 

// result, $x[1] is equal to array(1, 11) 

Или вы можете просто хотите:

// make $x equal to array(1) 
$x[] = 1; 

// append 11, making $x equal to array(1, 11) 
$x[] = 11; 

// result, $x is equal to array(1, 11) 
+0

Согласен, но его и массив массивов, и я не могу получить правильный порядок дерева, поэтому мне нужно построить массив на основе входящих данных – ntan

0

Вы не можете установить $x[1]и$x[1][11] одновременно. Помните, что в настройке $x[1][11] вы создаете массив с массивом вроде array(11 => 11) и присваиваете этот массив $x[1]. То, что вы пытаетесь сделать, это как 1, так и массив в $x[1], что невозможно.

0

Ваша проблема в том, что вы его переопределяете.

$x[1][11]=11; // $x[1] is Array(11 => 11) 
$x[1]=1; // $x[1] is int(1) 

var_dump($x); // Will output Array(1 => 1) 

и с вторым примером ...

$x[1]=1; // $x[1] is int(1) 
$x[1][11]=11; // $x[1] is Array(11 => 11) 

var_dump($x); // Will output int(1) 

Я не знаю точно, но я думаю, что вы хотите делать это:

$x[1][1]=1; // $x[1] is Array(1 => 1) 
$x[1][11]=11; // $x[1] is Array(1 => 1, 11 => 11) 

var_dump($x); // Will output Array(1 => 1, 11 => 11) 
0

Другой плакаты точно верны - вы переписываете значение $x[1] с массивом. Если вы хотите древовидную структуру, которая позволяет внутренние узлы помечать, вы смотрите на что-то вроде a trie:

class Node { 
    public $value = null, $children = array(); 
    public function set($keys, $value) { 
    if (empty($keys)) { 
     $this->value = $value; 
     return; 
    } 
    $key = array_shift($keys); 
    if (!isset($this->children[$key])) { 
     $this->children[$key] = new Node(); 
    } 
    $child = $this->children[$key]; 
    $child->set($keys, $value); 
    } 
} 

$trie = new Node(); 
$trie->set(array(1), 1); 
$trie->set(array(1, 11), 11); 
print_r($trie); 
Смежные вопросы