How to get Cxyabc, Cxy123 and Cxy234 inside an array from below object?
$xml_element = simplexml_load_string($xml,null, LIBXML_NOCDATA);
$childId = $xml_element->Parent->ChildID;
print_r(childId);
SimpleXMLElement Object (
[#attributes] => Array (
[entity] => result
[order-value] => 1
)
[0] => Cxyabc
[1] => Cxy123
[2] => Cxy234
)
Thanks for answers, i tried below one and working fine. string conversion is necessary.
$test = array();
foreach($childId as $value){
$strValue = (string)$value;
array_push($test,$strValue);
}
Try:
$cxyabc = $obj->{0};
$cxy123 = $obj->{1};
The usage of { } is necessary because object properties cannot begin with a digit so $obj->0 is not valid.
You would access the attributes using array notation:
$entity = $obj['entity'];
Related
I can't manage to sort an array alfabetically.
It's an array with cities that I get from an external XML.
The XML looks like this, and it's the node localidad I am trying to sort.
<parada>
<id>506</id>
<localidad>
<![CDATA[ Alvor ]]>
</localidad>
<parada>
<![CDATA[ Alvor Baia Hotel (Bus Stop Alvor Férias) ]]>
</parada>
<lat>37.1296</lat>
<lng>-8.58058</lng>
<horasalida>05:40</horasalida>
</parada>
The relevant code:
$xml = new SimpleXMLElement($viajes);
foreach ($xml->parada as $excursion) {
$newParadasarray[] = $excursion->localidad;
}
$newParadasarray = array_unique($newParadasarray);
foreach ($newParadasarray as $parada) {
if (strpos($parada, 'Almuñecar') !== false)
echo '<option value="Almuñecar">Almuñecar</option>';
if (strpos($parada, 'Benalmádena') !== false)
echo '<option value="Benalmádena Costa">Benalmádena Costa</option>';
if (strpos($parada, 'Estepona') !== false)
echo '<option value="Estepona">Estepona</option>';
etc.
}
I have tried with sort() and array_values().
This is the output of print_r($newParadasarray):
Array (
[0] => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
[1] => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
[2] => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
[4] => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
[9] => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
[14] => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
[20] => etc.
The problem is that your assigning a SimpleXMLElement into the array, instead you want the content of the element, so just change the line...
$newParadasarray[] = $excursion->localidad;
to
$newParadasarray[] = trim((string)$excursion->localidad);
The cast (string) takes the text content and trim() removes the extra whitespace around it.
I am assuming that you have multiple <parada> elements, so that $xml->parada is returning the correct data.
If you're familiar with DOMDocument you could simply do this:
$doc = new DOMDocument();
$doc->loadXML($xml);
$array = array();
foreach($doc->getElementsByTagName("localidad") as $localidad) {
$array[] = trim($localidad->nodeValue);
}
$array = array_unique($array);
sort($array);
I don't know what to do to get this done what would like to do. I tried multiple approaches, e.g. I used array_map, array_walk, nested foreach loops with get_object_vars and I worked with json_decode/encode and so on. I always come a little bit further but never reach my goal and I would like to get some guidance from you
Basically when you see the array below, how would you proceed when you want to change some value in the path array for multiple values in the array itself?
My questions:
1) Is it right that I must convert both nested objects to an array first or is this not nesessary to do this? I mean I always get some type conversion error which tells me that I either have everything as an object or array. Is this right?
2) If this mistery is solved, which php array function is the appropriate one to change values in an array(/object)? As I have written above, I tried so many and I don't see the trees in the woods anymore. Which one do you suggest to me to use in a foreach loop?
Array
(
[0] => stdClass Object
(
[doc] => stdClass Object
(
[path] => Array
(
[0] => Bob
[1] => pictures
[2] => food
)
)
)
[1] => stdClass Object
(
[doc] => stdClass Object
(
[path] => Array
(
[0] => Alice
[1] => pictures
[2] => vacations
[3] => rome
)
)
)
)
I would suggest that,
you create an array with keys as new path and value as old path (
path to be replaced).
Loop you path array and check if it is available in above defined array.
If available replace it with key of above defined array.
For example
// array defined as point 1
$change_path_array= array('pics'=>'pictures','meal'=>'food');
// $array is your array.
foreach ($array as $value) {
// loop you path array
for($i=0;$i<count($value->doc->path);$i++){
// check if the value is in defined array
if(in_array($value->doc->path[$i],$change_path_array)){
// get the key and replace it.
$value->doc->path[$i] = array_search($value->doc->path[$i], $change_path_array);
}
}
}
Out Put: picture is replaced with pics and food with meal
Array
(
[0] => stdClass Object
(
[doc] => stdClass Object
(
[path] => Array
(
[0] => Bob
[1] => pics
[2] => meal
)
)
)
[1] => stdClass Object
(
[doc] => stdClass Object
(
[path] => Array
(
[0] => Alice
[1] => pics
[2] => vacations
[3] => rome
)
)
)
)
You can modify the code to check casesensitive.
Example of changing all pictures to photos:
$doc1 = new \stdClass;
$doc1->doc = new \stdClass;
$doc1->doc->path = array('Bob', 'pictures', 'food');
$doc2 = new \stdClass;
$doc2->doc = new \stdClass;
$doc2->doc->path = array('Alice', 'pictures', 'vacations', 'rome');
$documents = array($doc1, $doc2);
/* change all 'pictures' to 'photos' */
foreach ($documents as &$doc) {
foreach ($doc->doc->path as &$element) {
if ($element == 'pictures') {
$element = 'photos';
}
unset($element);
}
unset($doc);
}
print_r($documents);
You can do it like this:
for($i = 0; $i < count($arr); $i++){
$path_array = $arr[$i]->doc->path;
// do your modifications for [i]th path element
// in your case replace all 'Bob's with 'Joe's
$path_array = array_map(function($paths){
if($paths == 'Bob') return 'Joe';
return $paths;
}, $paths_array);
$arr[$i]->doc->path = $path_array;
}
I have an array inside which I have stdclassObjects. I need to convert those stdClassObjects to arrays. Below is the array:
Array
(
[serial] => #253
[details] => stdClass Object
(
[Department] => stdClass Object
(
[value] => CI DATA CENTER
)
[City] => stdClass Object
(
[value] => NYC
)
)
[owner] => Drey
)
Could somebody please assist me?
The super lazy way is json_decode and json_encode:
$multiDimArray = json_decode(json_encode($multiDimObject), true);
The documentation on json_decode specifies the second parameter being:
assoc
When TRUE, returned objects will be converted into associative arrays.
function convertStdClassToArray($stdClass) {
$outputArray = [];
if (is_array($stdClass) || !empty($stdClass)) {
foreach ($stdClass as $field => $value) {
$outputArray[$field] = $this->convertStdClassToArray($value);
}
}
return $outputArray;
}
I am trying to create an array of titles from an xml feed using this code:
$url = 'https://indiegamestand.com/store/salefeed.php';
$xml = simplexml_load_string(file_get_contents($url));
$on_sale = array();
foreach ($xml->channel->item as $game)
{
echo $game->{'title'} . "\n";
$on_sale[] = $game->{'title'};
}
print_r($on_sale);
The echo $game->{'title'} . "\n"; returns the correct title, but when setting the title to the array i get spammed with this:
Array
(
[0] => SimpleXMLElement Object
(
[0] => SimpleXMLElement Object
(
)
)
[1] => SimpleXMLElement Object
(
[0] => SimpleXMLElement Object
(
)
)
[2] => SimpleXMLElement Object
(
[0] => SimpleXMLElement Object
(
)
)
Am I missing something when setting this array?
Use this:
$on_sale[] = $game->{'title'}->__toString();
or even better (in my opinion):
$on_sale[] = (string) $game->{'title'};
PHP doesn't know that you want the string value when you add the object to the array, so __toString() doesn't get called automatically like it does in the echo call. When you cast the object to string, __toString() is called automatically.
FYI: You don't really need the curly braces either, this works fine for me:
$on_sale[] = (string) $game->title;
So if having a multidimensional array like:
Got it from here (as a demo): PHP. Loop through an array and get items with attributes in common
$data
Array
(
[0] => stdClass Object
(
[term_id] => 3
[name] => Comercial
)
[1] => stdClass Object
(
[term_id] => 4
[name] => Escolar
)
[2] => stdClass Object
(
[term_id] => 5
[name] => Kinder
)
[3] => stdClass Object
(
[term_id] => 6
[name] => Primaria
)
[4] => stdClass Object
(
[term_id] => 7
[name] => Secundaria
)
[5] => stdClass Object
(
[term_id] => 1
[name] => Uncategorized
)
)
Having 0,1,2,3,4,5 stdClass Objects, how can I create individual arrays for each std Object dynamically.
By that I mean that the function should be able to create $varX array, where X is the array number of the stdObject, automatically...
$var0 = $data[0];
$var1 = $data[1];
and so on, determined by $data first level count of arrays.
Edit:
I got carried away and forgot to mention the most important question:
Having $var0, $var1... is very important because for a later use of all or each one individually.
So
Needs to create X variables according to the count of first level of the multidimensional array
each $varX needs to be accessible in common with the rest of $varX or individually.
$count = count($data); //6
foreach ($data as $key => $value)
{
$var.$key = $value;
}
Ok, that function works partially because from there I don't know how to make it automatically add $val1,$val2... to (ex:) array_intersect($val1,$val2,$val3...
The easiest way would be to use extract.
extract($data, EXTR_PREFIX_ALL, 'var');
With that said, it will add an underscore (_) after the prefix (e.g. var_0).
Update:
Regarding your edit, you could simply call array_intersect using call_user_func_array. There's no need for variables.
call_user_func_array('array_intersect', $data);
foreach ($data as $key => $obj)
{
$key = 'var'.$key;
$$key = $obj;
}
You can just cast each object to an array.
foreach ($data AS $key => $datum)
{
$data[$key] = (array) $datum;
}
For your update:
foreach ($data AS $key => $datum)
{
$newkey = 'var' . $key; // we want the variable to be called "var" plus the number
$$newkey = (array) $datum; // Make it an array
$data[$key] = $$newkey; // And update the $data array to contain the array
}
You now have $var0, $var1, etc and can also access them as a collection in $data, and they're in both as an array.