Подготовка многомерного массива для дерева управления ExtJS - PullRequest
1 голос
/ 23 марта 2011

пожалуйста, не закрывайте этот вопрос как повторяющийся .......... Я новичок в php.Я разрабатываю одну сетку дерева в extjs.were мне нужно отобразить поле в формате дерева. Поэтому для внешнего интерфейса мне нужно отправить закодированные данные.Мне нужны 2 функции для кодирования и декодирования строковой переменной, многомерного массива, переменных с набором разделителей.Например, если у меня есть массив .........

array(
array( "task" => "rose",
"duration" => 1.25,
"user" => 15
),
array( "task" => "daisy",
"duration" => 0.75,
"user" => 25,
),
array( "task" => "orchid",
"duration" => 1.15,
"user" => 7
),
array( "task" => "sunflower",
"duration" => 1.50,
"user" => 70
)

);

я хочу закодировать все поля массива или одно поле как ..........

array(
array( "task" => "rose",
"duration" => 1.25,
"user" => 15
),
array( "task" => "daisy",
"duration" => 0.75,
"user" => 25$sbaa,
),
array( "task" => "orchid",
"duration" => 1.15,
"user" => 7$!ass,
),
array( "task" => "sunflower",
"duration" => 1.50,
"user" => 70$!abc
)

);

Так вот как только мне нужно закодировать строку, переменные с разделителями ......... позже все закодированные значения должны быть декодированы до того, как они будут возвращены в конец .....это я должен использовать этот плагин .......... encode.class.php ...........

<?php

/*-------------------------
Author: Jonathan Pulice
Date: July 26th, 2005
Name: JPEncodeClass v1
Desc: Encoder and decoder using patterns.
-------------------------*/

class Protector
{

var $Pattern = "";
var $PatternFlip = "";
var $ToEncode = "";
var $ToDecode = "";
var $Decoded = "";
var $Encoded = "";
var $Bug = false;
var $DecodePattern = "";

function Debug($on = true)
{
$this->Bug = $on;
}

function Encode()
{


$ar = explode(":", $this->Pattern);
$enc = $this->ToEncode;

if ($this->Bug) echo "<!-- BEGIN ENCODING -->\n";

foreach ($ar as $num => $ltr)
{
switch ($ltr)
{
case "E":
$enc = base64_encode($enc);
break;
case "D":
$enc = base64_decode($enc);
break;
case "R":
$enc = strrev($enc);
break;
case "I":
$enc = $this->InvertCase($enc);
break;
}
if ($this->Bug) echo "<!-- {$ltr}: {$enc} -->\n";
}

if ($this->Bug) echo "<!-------------------->\n\n";

@$this->Encoded = ($enc == $this->Str) ? "<font color='red'>No Encoding/Decoding Pattern Detected!</font>" : $enc;

return $this->Encoded;

}

function Decode()
{

$pattern = ($this->DecodePattern != "") ? $this->DecodePattern : $this->Pattern;

//Reverse the pattern
$this->PatternFlip($pattern);

//make into an array
$ar = explode(":", $this->PatternFlip);

$t = ($this->Encoded == "") ? $this->ToDecode : $this->Encoded;

if ($this->Bug) echo "<!-- BEGIN DECODING -->\n";

foreach ($ar as $num => $ltr)
{
switch ($ltr)
{
case "E":
$t = base64_encode($t);
break;
case "D":
$t = base64_decode($t);
break;
case "R":
$t = strrev($t);
break;
case "I":
$t = $this->InvertCase($t);
break;
}
if ($this->Bug) echo "<!-- {$ltr}: {$t} -->\n";
}

if ($this->Bug) echo "<!-------------------->\n\n";

$this->Decoded = ($t == $this->Encoded) ? "<font color='red'>No Encoding/Decoding Pattern Detected!</font>" : $t;

return $this->Decoded;

}

function MakePattern($len = 10)
{
//possible letters
// E - Base64 Encode
// R - Reverse String
// I - Inverse Case
$poss = array('E','R', 'I');

//generate a string
for ( $i = 0 ; $i < $len ; $i++ )
{
$tmp[] = $poss[ rand(0,2) ];
}

//echo $str. "<br>";
//fix useless pattern section RR II
$str = implode(":", $tmp);

//fix
$str = str_replace( 'R:R:R:R:R:R' , 'R:E:R:E:R:E' , $str );
$str = str_replace( 'R:R:R:R:R' , 'R:E:R:E:R' , $str );
$str = str_replace( 'R:R:R:R' , 'R:E:R:E' , $str );
$str = str_replace( 'R:R:R' , 'R:E:R' , $str );
$str = str_replace( 'R:R' , 'R:E' , $str );

//fix
$str = str_replace( 'I:I:I:I:I:I' , 'I:E:I:E:I:E' , $str );
$str = str_replace( 'I:I:I:I:I' , 'I:E:I:E:I' , $str );
$str = str_replace( 'I:I:I:I' , 'I:E:I:E' , $str );
$str = str_replace( 'I:I:I' , 'I:E:I' , $str );
$str = str_replace( 'I:I' , 'I:E' , $str );

//string is good, set as pattern
$this->Pattern = $str;
return $this->Pattern; //if we need it

}

function PatternFlip($pattern)
{
//reverse the pattern
$str = strrev($pattern);

$ar = explode(":", $str);

foreach ($ar as $num => $ltr)
{
switch ($ltr)
{
case "E":
$tmp[] = "D";
break;
case "D":
$tmp[] = "E";
break;
case "R":
$tmp[] = "R";
break;
case "I":
$tmp[] = "I";
break;
}

}

$rev = implode(":", $tmp);

$this->PatternFlip = $rev;

return $this->PatternFlip;
}

// This is my custom Case Invertor!
// if you would like to use this in a script, please credit it to me, thank you
function InvertCase($str)
{
//Do initial conversion
$new = strtoupper( $str );

//spluit into arrays
$s = str_split( $str );
$n = str_split( $new );

//now we step through each letter, and if its the same as before, we swap it out
for ($i = 0; $i < count($s); $i++)
{
if ( $s[$i] === $n[$i] ) //SWAP THE LETTER
{
//ge the letter
$num = ord( $n[$i] );

//see if the ord is in the alpha ranges ( 65 - 90 | 97 - 122 )
if ( ( $num >= 65 AND $num <= 90 ) OR ( $num >= 97 AND $num <= 122 ) )
{
if ($num < 97 ) { $num = $num + 32; }
else { $num = $num - 32; }

$newchr = chr($num);

$n[$i] = $newchr;
}
}
}

//join the new string back together
$newstr = implode("", $n);

return $newstr;

}

}

?> ............ из этого плагина мне нужно использовать функции кодирования и декодирования для своих функций ......... если кто-то может мне помочь в этом .......это будет очень полезно для меня .......

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Хорошо, давайте разберем проблему.

У вас есть массив. Каждый элемент в массиве является хешем. Одно (или более) из значений в этом хэше имеет для кодирования с использованием этой ужасной мерзости библиотеки. Но библиотека не может обрабатывать массивы.

Нам придется обрабатывать массив самостоятельно.

<rant>
Прежде чем мы начнем, я хотел бы еще раз выразить, насколько ужасно разработан этот код "Protector". Он написан для PHP4 и представляет собой код спагетти, заключенный в класс. Он неправильно использует свойства, как будто пользователь неправильно запомнил, как работают переменные экземпляра Java , и почему-то думал, что было бы целесообразно или разумно использовать PHP таким же образом. Если автор кода не оглядывается назад на этот отвратительный кусок байтов сейчас с полным пренебрежением, то с ним что-то серьезно не так.
</rant>

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

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

$keys_to_encode = array( 'user' );

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

Теперь давайте подготовим нашего "Защитника". Кажется, вам нужно либо указать шаблон, либо использовать метод MakePattern, чтобы создать его. Мы собираемся указать его вручную, потому что MakePattern может создавать практически бесполезные комбинации.

$stupid = new Protector();
$stupid->Pattern = 'E:I:E:R:D:I:E';

Это будет base64-кодировать, перевернуть регистр, base64 снова, перевернуть его, un-base64, перевернуть регистр, а затем повторно base64. Имейте в виду, что PHP-декодер base64 «правильно» игнорирует плохие отступы и неожиданные символы, что является единственной причиной, по которой работает base64-reverse-unbase64. Результирующая строка будет выглядеть как бред для людей, которые не знают, как выглядит base64, и не-base64 для бреда для людей, которые знают, как выглядит base64.

Если вам нужно кодировать значения определенным образом, вы бы просто изменили шаблон. Важно, чтобы вы либо жестко запрограммировали шаблон, либо сохранили его где-нибудь вместе с данными, потому что без него вам будет сложно выполнить декодирование. (Я имею в виду, это можно сделать вручную , но вы не хотите этого делать.) Я ожидаю, что ваш начальник даст вам конкретные инструкции по схеме, учитывая, что вы не не может использовать этот полный провал в классе.

Теперь пришло время обработать наши данные. Давайте представим, что $in содержит ваш исходный массив.

$out = array();
foreach($in as $k => $target) {
    foreach($keys_to_encode as $target_key) {
        $stupid->ToEncode = $target[ $target_key ];
        $target[ $target_key ] = $stupid->Encode();
    }
    $out[$k] = $target;
}

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

Декодирование так же просто. Вы заявили, что ваша цель - позволить пользователям редактировать определенные данные в виджете дерева, и вы, похоже, хотите защитить основные ключи. Это говорит мне, что вам , вероятно, нужно иметь дело только с одним из хэшей за раз. Поэтому я собираюсь написать этот пример декодирования, используя только одно значение, $whatever.

$stupidest = new Protector();
$stupidest->Pattern = 'E:I:E:R:D:I:E'; // SAME PATTERN!
$stupidest->ToDecode = $whatever;
$decoded = $stupidest->Decode();

Опять же, критически , что вы используете тот же шаблон декодирования здесь.

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

0 голосов
/ 23 марта 2011

Почему вы не используете json_encode? Просто сделай

$str=json_encode($array);

Затем отправьте данные, а на другом конце сделайте

$array=json_decode($str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...