如何在PHP中构建多维数组

3
我正在尝试使用一个字符串数组来构建PHP中的多维数组。我会将字符串1:wlrb@yahoo.com:7:8.35切割成一个数组。
"id": "1",  
"email_address": "wlrb@yahoo.com",  
"domain": "yahoo.com",  
"number_of_orders": "7",    
"total_order_value": "£8.35"

在 JavaScript 中,我会创建一个包含上述值的对象,并将其放入一个数组中,但是在 PHP 中应该如何实现呢?
目前我有以下代码可以输出如下结果:
``` Array ( [0] => stdClass Object ( [id] => 1 [email] => wlrb@yahoo.com [domain] => yahoo.com [number_of_orders] => 7 [total_order_value] => 8.35 ) ```
<?php

$data = file_get_contents('orderdata');
/* echo $data; */

$lines = explode("\n", $data);

array_splice($lines, 0, 8);
/* var_dump($lines); */

array_splice($lines, -3);
/* var_dump($lines); */

/* removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values */
$lines = array_values(array_filter($lines, 'strlen'));


function arraySort($lines ,$i) {
    $rep = new stdClass();
    $rep->id = strId($lines, $i);
    $rep->email = strEmail($lines, $i);
    $rep->domain = strDomain($lines, $i);
    $rep->number_of_orders = orderNo($lines, $i);
    $rep->total_order_value = orderValue($lines, $i);
    /* var_dump($rep); */
    return $rep;
}


function strDomain($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        $domain = explode('@', $splt[1]);
        return $domain[1];
    }
}


function strId($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return $splt[0];
    }

}


function strEmail($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return $splt[1];
    }
}


function orderNo($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return $splt[2];
    }
}


function orderValue($lines, $i) {
    if($lines[$i] == null){
        return "";
    } 
    else {
        $str = $lines[$i];
        $splt = explode(':', $str);
        return '£' + $splt[3];
    }
}

$reports = array();
$reps = array();
for($i = 0, $length = count($lines); $i < $length; ++$i) {
    $reps = arraySort($lines, $i);
    array_push($reports, $reps);
}

?>

但是当我尝试使用以下代码搜索数组时

$filteredArray = 
array_filter($reports, function($element) use($search){
  return isset($element['domain']) && $element['domain'] == $search;
});

我遇到了以下错误:
致命错误:在phpData.php的第110行,无法将stdClass对象用作数组。堆栈跟踪:#0 [内部函数]:{closure}(Object(stdClass))#1 phpData.php(111):array_filter(Array,Object(Closure))#2 {main}抛出
这是因为我在我的arraySort函数中使用了$rep = new stdClass();吗?如果是这样,我应该使用什么?

是的,这就是原因,你试图将一个对象用作数组,只有当你将对象传递给\ArrayObject(http://php.net/manual/en/class.arrayobject.php)或者使用一个数组时才可能实现。 - DaGhostman Dimitrov
2个回答

1
最简单和最短的解决方案是:


$value = "1:wlrb@yahoo.com:7:8.35";
$keys = array('id', 'email_address', 'number_of_orders', 'total_order_value');
$fused = array_combine($keys, explode(':', $value));
$fused['domain'] = strDomain($fused['email_address']); //using your "strDomain()" function

它会给你想要的数组,但订单价值中将没有“£”符号。

谢谢,这是一个很好的解决方案,可以节省很多代码。我如何获取在@处分割的域名yahoo.com? - pedaars
我认为可能是这样的: $value = strDomain($lines, $i); $fused["domain"] = "$value"; - pedaars
看看更新后的答案,我认为它可以解决你的问题。 - Julien Lachal

0

你可以像这样使用对象获取方法:

$filteredArray = 
array_filter($reports, function($element) use($search){
  return isset($element->domain) && $element->domain == $search;
});

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