Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php] array sort

Pagina: 1
Acties:

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Ik heb de volgende array:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [type] => array
        )

    [parent] => Array
        (
            [0] => SimpleXMLElement Object
                (
                      [child] => 0
                )
            [1] => SimpleXMLElement Object
                (
                      [child] => 50
                )
        )
)


Nu wil ik bij het uitlezen de sorting eerst aanpassen op basis van een child. Daarvoor heb ik een functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function xsort(&$nodes, $child_name, $order = SORT_ASC)
{
    $sort_proxy = array();

    foreach ($nodes as $k => $node)
    {
        $sort_proxy[$k] = (int) $node->$child_name;
    }

    array_multisort($sort_proxy, $order, $nodes);
}
?>


Deze lijkt mij precies te doen wat ik wil door deze aan te roepen met:
PHP:
1
2
3
<?php
xsort($array, 'child', SORT_ASC);
?>


De functie geeft mij echter een foutmelding:

Argument #3 is expected to be an array or a sort flag in ...php line # (de array_multisort regel).

Nu heb ik na wat googlen gevonden dat mijn SimpleXMLElement Object niet een echte array is maar wel als een array te benaderen is. Mijn vraag is dus klopt dat betekend dit dat mijn xsort functie dus niet gaat werken?

Dying is God's way of telling you, you've been FIRED.


  • phex
  • Registratie: Oktober 2002
  • Laatst online: 15-11 16:07
Volgens mij gaat dat inderdaad niet werken, echter er zijn wel functies te vinden waarmee je een simple xml object kan omzetten naar een array.

  • Solopher
  • Registratie: December 2002
  • Laatst online: 30-10 12:28
Je kunt een object heel makkelijk casten naar een array.

PHP:
1
(array)$array

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Solopher schreef op vrijdag 19 oktober 2012 @ 15:44:
Je kunt een object heel makkelijk casten naar een array.

PHP:
1
(array)$array
Dat zou geniaal zijn maar ik heb het idee dat dit niet helemaal goed werkt gezien mijn array er nu zo uitziet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array
(
    [@attributes] => Array
        (
            [type] => array
        )

    [parent] => Array
        (
            [0] => SimpleXMLElement Object
                  (
                          [child] => 0
                  )
            [1] => SimpleXMLElement Object
                  (
                          [child] => 50
                  )
        )
)


en op 1 of andere manier wil deze code daar niet mee werk:

PHP:
1
2
3
foreach($array as $arr) {
    echo $arr['child'];
}


Krijg dan namelijk Undefined index: child. Het lijkt nu of het object een array is geworden net zoals de parent maar dat de childeren nog steeds een SimpleXMLElement is, lees ik dit zo goed?

Dying is God's way of telling you, you've been FIRED.


  • Miyamoto
  • Registratie: Februari 2009
  • Laatst online: 23-11 23:04
Onderstaande functie uit de comments op php.net gehaald:

PHP:
1
2
3
4
5
6
7
8
9
<?php
function xml2array ( $xmlObject, $out = array () )
{
        foreach ( (array) $xmlObject as $index => $node )
            $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;

        return $out;
}
?>

  • Cartman!
  • Registratie: April 2000
  • Niet online
Weet nog wel een kortere (maar niet minder lame) manier die ook rap is:

PHP:
1
$array = json_decode(json_encode($array), true);

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Cartman! schreef op vrijdag 19 oktober 2012 @ 21:14:
Weet nog wel een kortere (maar niet minder lame) manier die ook rap is:

PHP:
1
$array = json_decode(json_encode($array), true);
Deze optie lijkt in mijn geval goed te werken, hij maakt van alle objecten een array nu. Nu probeer ik de array te sorteren door de xsort functie. Hij pakt alleen de child node niet hij loopt bij de xsort functie tegen de foutmelding:
Undefined index: Child

Ik vermoed dus dat ik op een verkeerd niveau zit bij deze regel in de xsort functie:
PHP:
1
$sort_proxy[$k] = (int) $node[$child_name];


De vraag is even hoe kan ik ervoor zorgen dat hij wel op het juiste niveau zit?

Dying is God's way of telling you, you've been FIRED.


  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
misschien moet je even netjes door je xml result heen om daar netjes de data eruit te halen die je nodig hebt.

Dan kun je namelijk ook stuk makkelijker je children typecasten.

Je krijgt dan misschien wel iets meer code, maar dit voorkomt wel problemen met je array.

[ Voor 20% gewijzigd door steffex op 22-10-2012 14:52 ]


  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
steffex schreef op maandag 22 oktober 2012 @ 14:51:
misschien moet je even netjes door je xml result heen om daar netjes de data eruit te halen die je nodig hebt.

Dan kun je namelijk ook stuk makkelijker je children typecasten.

Je krijgt dan misschien wel iets meer code, maar dit voorkomt wel problemen met je array.
Dat is even het probleem, ik gebruik een standaard class om calls te doen die het resultaat omzet naar een array d.m.v SimpleXMLElement(). Dit is volgens mij de meest gangbare manier en zou dus ook moeten werken. Ik zie niet hoe ik dit efficiënter kan doen door zelf code te gaan maken?

Dying is God's way of telling you, you've been FIRED.


  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
Ja dat is heel gangbaar, maar ik praat meer over de verwerking van de data die de functie teruggeeft. Het blijkt dus dat deze data niet standaard bruikbaar is voor jou. Je zult dus de data moeten verwerken, zodat jij het wel goed kunt gebruiken.

even snel een voorbeeld (klopt niet helemaal met jouw array print):
PHP:
1
2
3
4
5
6
<?php
$data = array();
$xml = new SimpleXMLElement('http://example.org/document.xml', NULL, TRUE);
foreach( $xml['parent'] as $i => $child ) {
$data[$i] = (int)$child;
}


je krijgt dan netjes een mooie array met daarin de child elementen...

Het nadeel van SimpleXMLElement is dat deze een SimpleXMLElement-object teruggeeft in plaats van een normaal element. Het enige wat je dus hoeft te doen om dit te fixen is het type casten van de elementen daarin. Je moet dus een keer extra door je SimpleXMLElement object heen om dat te bewerkstelligen.

[ Voor 23% gewijzigd door steffex op 22-10-2012 15:18 . Reden: extra info ]


  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
steffex schreef op maandag 22 oktober 2012 @ 15:14:
Ja dat is heel gangbaar, maar ik praat meer over de verwerking van de data die de functie teruggeeft. Het blijkt dus dat deze data niet standaard bruikbaar is voor jou. Je zult dus de data moeten verwerken, zodat jij het wel goed kunt gebruiken.

even snel een voorbeeld (klopt niet helemaal met jouw array print):
PHP:
1
2
3
4
5
6
<?php
$data = array();
$xml = new SimpleXMLElement('http://example.org/document.xml', NULL, TRUE);
foreach( $xml['parent'] as $i => $child ) {
$data[$i] = (int)$child;
}


je krijgt dan netjes een mooie array met daarin de child elementen...

Het nadeel van SimpleXMLElement is dat deze een SimpleXMLElement-object teruggeeft in plaats van een normaal element. Het enige wat je dus hoeft te doen om dit te fixen is het type casten van de elementen daarin. Je moet dus een keer extra door je SimpleXMLElement object heen om dat te bewerkstelligen.
Ok, ik ga de class er dan even tussenuit halen om te kijken of het mij lukt dit op deze manier te verwerken.

Dying is God's way of telling you, you've been FIRED.

Pagina: 1